283. 移动零
时间:2020年11月19日
知识点:双指针、快排思想
题目链接:https://leetcode-cn.com/problems/move-zeroes/
题目
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
解法:
- 很简单就能想到 用下标做指引 不是0的数据放进去 下标增加 最后剩下的全是0
- 第一种方法 需要遍历两遍 可不可以遍历一次呢
- 运用快排的思想 两个指针移动 用指针i指向数字为0的情况 j向后遍历
- 比如说 1 2 0 3 这个情况 1和2都不用动 i、j同时增加 直到i遇到了0 j往后找 非0的 两者交换
- 交换后i j如何变化呢 在看 当0 1 0 3 一次交换后 1 0 0 3
- i还是在0 j在1 i需要指向下一个 因为下一个必是0(举例子很好理解)符合我们之前设置条件 j继续向后找
- 直到j到达最后
- 再手动模拟下 0 1 0 2 12 、 1 0 0 2 12 、1 2 0 0 12 、 1 2 12 0 0
- i=0 j=1 swap i=1 j=1 j++
- i=1 j=3 swap i=2 j=3 j++
- i=2 j=4 swap
代码
#include <stdio.h>
#include <vector>
#include <iostream>
using namespace std;
class Solution {
public:
void moveZeroes(vector<int>& nums) {
if(nums.size()==0)
return;
int index = 0;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] != 0)
nums[index++] = nums[i];
}
while (index < nums.size()) {
nums[index++] = 0;
}
}
};*/
class Solution {
public:
void moveZeroes(vector<int>& nums) {
if(nums.size()==0)
return;
int i = 0;
for(int j = 0;j < nums.size();j++){
if(nums[j] != 0){
// 不是0的话 不需要原地交换
if(i != j)
swap(nums[i],nums[j]);
i++;
}
}
return ;
}
};
int main()
{
vector<int> nums{1,4,0,3,12};
Solution s;
s.moveZeroes(nums);
for(int x:nums)
cout<<x<<endl;
return 0;
}
今天也是爱zz的一天哦!