双指针
class Solution {public void moveZeroes(int[] nums) {int n = nums.length;int right = 0, left = 0;while (right < n) {if (nums[right] != 0) {swap(nums, left, right);left++;}right++;}}public void swap (int[] nums, int left, int right) {int temp = nums[left];nums[left] = nums[right];nums[right] = temp;}
}
该Java代码实现了一个moveZeroes
函数,它的目的是将数组nums
中的所有0移动到数组的末尾,同时保持非零元素的相对顺序。函数使用了一个双指针技巧,其中left
指针用于指向当前非零元素应该放置的位置,而right
指针用于遍历整个数组。
具体步骤如下:
- 初始化
left
和right
指针都为0,并获取数组长度n
。 - 进入
while
循环,条件是right
指针小于数组长度n
,确保整个数组都被遍历。 - 在循环内部,如果
nums[right]
不等于0,说明找到了一个非零元素。 - 调用
swap
函数交换nums[left]
和nums[right]
的值,这样非零元素就被移动到了left
指针所指向的位置。 - 将
left
指针向右移动一位,为下一个非零元素腾出位置。 - 无论
nums[right]
是否为0,都将right
指针向右移动一位,继续遍历数组。
当right
指针遍历完整个数组后,所有非零元素都被移动到了数组的前面,而所有0都被移动到了数组的末尾。
这个算法的时间复杂度是O(n),其中n是数组的长度,因为right
指针遍历了整个数组一次。空间复杂度是O(1),因为我们只使用了常数个额外变量,并没有使用与数组大小相关的额外空间。
另外,swap
函数是一个辅助函数,用于交换数组中两个位置的值。它通过临时变量temp
来保存一个元素的值,然后交换两个位置的值。
总的来说,这个算法是一个有效的原地操作,满足题目要求。