双指针
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来保存一个元素的值,然后交换两个位置的值。
总的来说,这个算法是一个有效的原地操作,满足题目要求。