[Array]Remove Element

Given an array and a value, remove all instances of that value in place and return the new length.

Do not allocate extra space for another array, you must do this in place with constant memory.

The order of elements can be changed. It doesn’t matter what you leave beyond the new length.

Example:
Given input array nums = [3,2,2,3], val = 3

Your function should return length = 2, with the first two elements of nums being 2.

第一种方法:
lazy way:

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        for(vector<int>::iterator it = nums.begin();it!=nums.end();it++){
            if(*it==val){
                 it=nums.erase(it);
                 it--;
            }
        }
        return nums.size();
    }
};

第二种方法:
因为可以打乱顺序并且只需要前面size个有效即可,那么采用下种方法更简单。但下文方法中i与j每一个最多可能遍历n次。

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

第三种方法:
two pointer思想,这种方法first与last一共加起来最多可以遍历n次,并且移动覆盖的次数为向量中值val的个数。因此此方法当val的个数很少的时候采取较适宜。

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
       int first = 0;
       int last = nums.size()-1;
       while(first<=last){
           if(nums[first]==val){
               nums[first]=nums[last];
               last--;
           }
           else{
               first++;
           }
       }
       return first;
    }
};
posted @ 2016-06-29 08:25  U_F_O  阅读(123)  评论(0编辑  收藏  举报