力扣 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++;
    }
};
posted @ 2022-04-05 18:06  付玬熙  阅读(24)  评论(0编辑  收藏  举报