给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意,必须在不复制数组的情况下原地对数组进行操作。
283. 移动零
思路
- 局部左右指针,实际上存在很多不必要的交换和比较,复杂度为
O(n^2)
update:快慢指针
- 慢指针指向当前已经处理好的序列的尾部,快指针指向待处理序列的头部
- 慢指针写入,快指针查找
- 当快指针所指元素不为 0,交换快慢指针元素(交换是因为慢指针指的元素可能不为 0)
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| class Solution { public: void moveZeroes(vector<int>& nums) { int len = nums.size(); int left = 0; while (left < len) { if (nums[left] != 0) { left++; } else { int right = left + 1; while (right < len) { if (nums[right] == 0) { right++; } else { break; } } if (right >= len) { break; } nums[left++] = nums[right]; nums[right] = 0; } } } };
|
update:快慢指针
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Solution { public: void moveZeroes(vector<int>& nums) { int len = nums.size(); int slow = 0; int fast = 0; while (fast < len) { if (nums[fast] != 0) { swap(nums[slow], nums[fast]); slow++; } fast++; } } };
|