LeetCode 283.移动零
难易程度
- easy
题目考察
- 双指针
- 数组元素的移动
暴力解法
思路:先遍历数组,统计数组中0的个数,再遍历数组,使用双指针删除0,最后遍历剩余数组赋值为0
//双指针,删除0,添加0
//时间复杂度O(n),空间复杂度O(1)
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int n = 0;
//统计数组中零的个数
for (int i = 0; i < nums.size(); i++) {
if (nums[i] == 0) {
n++;
}
}
int j = 0;
//遍历数组,将零元素删除
for (int i = 0; i < nums.size(); i++) {
if(nums[i] != 0) {
nums[j++] = nums[i];
}
}
//将剩余数组填补为0
for (int i = nums.size() - n; i < nums.size(); i++) {
nums[i] = 0;
}
}
};
优化解法
思路:定义双指针i,j都指向nums[0],只要nums[j] == 0,j++,否则就交换nums[i]和nums[j]的位置,i++,j++;
//双指针,判断
//时间复杂度O(n),空间复杂度O(1)
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int i = 0, j = 0;
while (j < nums.size()) {
if (nums[j] == 0) {
j++;
} else {
//将非0元素与0元素交换位置
swap(nums[i++], nums[j++]);
//swap(nums[i], nums[j]); i++;j++;
}
}
}
};
总结
虽然是简单题,但是可拓展思路,了解双指针的使用和优化,加油!