[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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值