移动零的算法
在编程中,处理数组时常会遇到需要对特定元素进行操作的情况。今天,我们将讨论一个常见的问题:如何将数组中的所有零移动到末尾,同时保持非零元素的相对顺序。
问题描述
给定一个数组 nums
,你需要将所有 0 移动到数组的末尾,同时保持其他非零元素的相对顺序。请注意,必须在原地操作,不要使用额外的数组空间。
示例
输入:
[0, 1, 0, 3, 12]
输出:
[1, 3, 12, 0, 0]
算法思路
我们的思路是使用两个指针来实现这个任务。第一个指针遍历整个数组,第二个指针用于记录下一个非零元素应该放置的位置。
- 初始化一个索引变量
index
为 0,用于指向下一个非零元素的位置。 - 遍历数组,如果当前元素不是 0,就将其放置在
index
指向的位置,并将index
增加 1。 - 在第一轮遍历结束后,
index
的值将指向所有非零元素后的位置,因此我们可以在从index
到数组末尾的范围内填充 0。
代码实现
以下是实现这一算法的 Java 代码:
class Solution {
public void moveZeroes(int[] nums) {
int index = 0;
for(int i = 0; i < nums.length; i++){
if(nums[i] != 0){
nums[index] = nums[i];
index++;
}
}
for(int i = index; i < nums.length; i++){
nums[i] = 0;
}
}
}
代码解析
-
初始化索引:
int index = 0;
创建一个
index
变量,用于跟踪下一个非零元素的位置。 -
遍历数组:
for(int i = 0; i < nums.length; i++){ if(nums[i] != 0){ nums[index] = nums[i]; index++; } }
通过第一个
for
循环遍历数组,将非零元素移动到前面。每当我们找到一个非零元素,就将其放在index
指向的位置,并增加index
。 -
填充零:
for(int i = index; i < nums.length; i++){ nums[i] = 0; }
在第二个
for
循环中,从index
开始,将剩余的位置填充为 0。
时间复杂度
- O(n): 我们只需遍历数组两次,因此时间复杂度为线性。
空间复杂度
- O(1): 我们只使用了常数级别的额外空间。
总结
通过使用双指针的方法,我们能够有效地将数组中的零移动到末尾,同时保持其他元素的相对顺序。这种方法不仅高效,而且简单易懂。在实际应用中,这种策略可以被扩展到其他类型的元素移动问题上。
希望这篇文章能帮助你更好地理解如何处理数组中的元素移动问题!