移动零(方1:利用vector erase实现,方2:利用双指针思想实现)

题目:


给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:

必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。

分析:
方法一: 直接遍历,遇到0就删除,并在数组末尾添加见代码1
方法二:上一篇文章相似,方法一比较耗时,如果能够只针对非0元素进行移动,将其放到前面,时间复杂度能降低一级;见代码2,利用一个replace指针指向当前选一个替换的位置;
方法三: 遍历数组,replace指针指向遇到 第一个0 元素,此时向后遍历遇到的下一个非0元素,与replace指针指向进行交换;并记录当前非零元素位置;replace指针指向下一个 0 元素;
重复上述过程,并使用记录下来的非零元素位置开始寻找下一个非0元素;(与方法二的实现类似

代码1:ac

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int m = nums.size();
        if(!m)
            return;
        
        for(int i = 0; i < m; i++)
        {
            if(nums[i] == 0){
                nums.erase(nums.begin() +i);
                nums.push_back(0);
                i--;m--;
            }
        }
    }
};

代码2:ac
在这里插入图片描述

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int m = nums.size(), replace = 0;

        //  [0,1,0,3,12]	第一次遍历将前面所有的元素都换成非0的
        for(int i = 0; i < m; i++)
        {
            if(nums[i] != 0){
                nums[replace++] = nums[i];
                
            }
        }
        for(int i = replace; i < m; i++){	// 第二次遍历将剩下的元素都置为0
            nums[i] = 0;
        }
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值