[leetcode] 27. remove element

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

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

这样可以减少代码量。

题目为:

[leetcode] 27. remove element

简单说就是在一个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;
    }
};