Java Program to Rearrange The Array in Alternating Positive & Negative Items With O(1) Extra Space

2025年5月3日 | 阅读4分钟

问题陈述

给定一个整数数组,一个好的排列是正数和负数交替放置。如果多余的数字是正数或负数,由于不可能有相等数量的正负数来完美地交替它们,多余的数字应保留在数组的末尾,方向为从正到负。

此外,我们的解决方案应遵循 O(1) 的空间复杂度,这意味着只能对问题中提供的数组执行操作。

示例

例如,如果数组是 [3, -2, 5, -4, 1, -6],一个有效的解决方案可以是 [3, -2, 5, -4, 1, -6],其中正数跟随负数,或负数跟随正数,或者任何其他顺序,但正数和负数之间没有间隔。

问题解决方案

要就地解决此问题,我们将遵循以下主要步骤:

按符号划分数组: 通过简单的扫描将数组中的正数和负数分开。这将帮助我们识别错放的元素(例如,本应是负数的位置上出现了一个正数)。

按交替顺序放置元素: 遍历数组以确保元素按照正确的交替顺序排列。如果某个位置上的元素不符合要求的交替顺序,则将其与稍后符合要求的元素进行交换。

执行原地重排: 由于我们目标是 O(1) 的额外空间,所有交换都将在数组本身内完成,在原地调整元素,而无需额外的内存开销。

文件名:AlternatingPositiveNegative.java

输出

 
Rearranged array:
3 -2 5 -4 1 -6   

复杂度分析

时间复杂度: 由于每个元素都被检查一次并根据需要进行交换和排列,因此时间复杂度为 O(n)。

空间复杂度: 通过原地交换,我们可以实现 O(1) 的空间复杂度,因为除了给定数组使用的空间外,没有使用任何其他额外空间。

需要考虑的边缘情况

全正数或全负数: 否则,如果数组中的所有元素都是正数或所有元素都是负数,则函数不会以任何方式交换其元素,因为实际上不存在交替过程的可能性。

更多的正数或负数: 如果数组中正负元素的数量不相等,则剩余的元素将位于数组的末尾,即使数组元素已按交替方式排列。

单元素数组: 包含单个元素的数组的第一个也是最后一个组件将保持不变,因为不需要进行任何交替。

原地解决方案的优点

原地重排对于大型数组非常有益,因为它不需要额外的存储空间。因此,通过避免额外的数据结构,我们可以确保算法具有较小的内存占用,从而可以在内存空间有限的环境中使用。

结论

该方法为重新组织数组的问题提供了一种明显而有效的解决方案,使得任何正数跟随负数或反之,而无需依赖 O(1) 的额外空间和 O(n) 的时间。原地交换实现了内存效率和对大型数据集的性能。

这种翻转排列的问题解决模式在多种场景下都很有用,包括数据分析、切换排序模式以及在界面设计中呈现匹配良好的结果。