[leetcode] 27. remove element

c++11 支持auto自动变量: 已知nums是vector类型

用auto it = nums.begin()
代替
vector<int>::iterator it = nums.begin();

这样可以减少代码量。

题目为:

简单说就是在一个vector中将与给定的数val不同的数的个数n返回,同时此时的vector的前面的n个数是不同的数(顺序不必和原来的相同),新的vector的后面有没有,是什么都不重要,

本题可以用双指针的方法解决:

1.第一种双指针方法:

很直接了当,就是用了两个指针标记,当遇到相同的就用 j 记录下来,i 则一直往前走,直到末尾,这样,j 使得前 n 个数是不同的了,这个方法看似很合理,但是实际很慢,当遇到 [ 1,2,3,4,5] 而 i 为 5 时,i 和 j 都要走完5次,所以时间复杂度为O(2n) ,显然比较浪费 。

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int j = 0;
        for(int i = 0; i < nums.size(); i++)
        {
            if(val != nums[i])
                nums[j++] = nums[i];
        }
        return j;
    }
};

2.考虑用双指针聚拢的方法:

这种方法应该是最优的解法,将时间复杂度定在了O(n),思想就是向中心靠拢,当遇到相同的就把最后一个元素拉来比较,直到不同时才继续前进,充分利用了不考虑顺序,不考虑后面元素的规则。

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int i = 0;
        int j = nums.size();
        while(i < j)
        {
            if(nums[i] == val)
            {
                nums[i] = nums[--j];
            }
            else
            {
                i++;
            }
        }
        return j;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值