力扣 283.移动0 双指针
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12] 输出: [1,3,12,0,0]
示例 2:
输入: nums = [0] 输出: [0]
题解
在原表上修改,使用两个指针,l r
,l
指向当前更新的位置,r
往前搜索;
- 如果
r
上的元素=0,则r向右继续移动 - 如果
r
上元素!=0,则需要更新,将此元素与l
位置元素交换,使用swap
,并且l
向右移动,为下一次赋值做准备
被更新过的位置(l
左边)存储非0元素,r
在向右搜索,判断此位置元素是否需要存储
查看代码
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int l=0,r=0,len=nums.size();
while(r<len){
if(nums[r]!=0){
swap(nums[l++],nums[r]);
}
r++;
}
l++;
}
};