283. 移动零
移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
本人思路
题目要求必须在原数组上操作,很明显这是一道双指针类型的题目。我首先是这样想的,i 遇到 \(nums[i]=0\) 就停下,j 遇到 \(nums[j]!=0\) 就停下。然后交换 nums[i] 和 nums[j] 的位置,重复此操作即可完成题目要求。也就是说这个是特定条件下的选择排序,但提交上去的时间复杂度较高,原因应该是进行了大量的交换操作。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int i = 0, j = 0;
int n = nums.size();
while (i < n && j < n) {
while (i < n && nums[i] != 0) {
i++;
}
j = i + 1;
while (j < n && nums[j] == 0) {
j++;
}
if (i == n || j == n) break;
swap(nums[i], nums[j]);
}
}
};
最优解思路
说实话该思路一开始真是惊艳到我了。核心是:快指针遇到非零元素就赋值到慢指针处,然后慢指针移动一格,一旦快指针搜索完该数组所有的非零元素,就将慢指针之后的元素赋为0。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int n = nums.size();
int j = 0;
for (int i = 0; i < n; i++) {
if (nums[i] != 0) {
nums[j++] = nums[i];
}
}
for(int i = j; i < n; i++) nums[i] = 0;
}
};

浙公网安备 33010602011771号