刷题笔记+-+283.移动零+be5bc16d-9504-40d6-b23e-6a2648a4d21a
- 需要复习内容:快慢指针法
- ☐ 记住时间和空间复杂度
- [ ]
- [ ]
- 待办:
- ☐ 查一下时间复杂度
- ☐ 查一下空间复杂度
- [ ]
解法一:模拟
遍历一遍将非零元素前移,使用k控制下标
并且遍历过程中将零元素的个数cnt找出来;
然后再for一遍将数组的后cnt个元素赋值0;完成;
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int cnt=0;
int k=0;
for(int i=0;i<nums.size();i++){
if(nums[i]!=0){
nums[k++]=nums[i];
}
}
for(int i=k-1;k<nums.size();k++){
nums[k]=0;
}
}
};
解法二:快慢指针
slow去寻找为0的位置,fast负责for遍历数组找不为0的地方,前提是slow<fast
然后双方都找到后进行swap
解决。
class Solution {
public void moveZeroes(int[] nums) {
int slow=0;
int fast=0;
for(fast=0;fast<nums.length;fast++){
while(nums[slow]!=0&&slow<fast){
slow++;
}
if(nums[fast]!=0){
int tmp=nums[fast];
nums[fast]=nums[slow];
nums[slow]=tmp;
}
}
}
}