LeetCode | 27. 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.

去除数组中与给定值相同的元素,并调整数组,函数返回值为调整后的数组长度。要求不能使用额外的空间开销。

自己的思路:先排序,然后记录符合条件的元素个数,然后从首次出现的位置开始,向后依次替换。9MS AC

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int len = nums.size();
        int tot = 0;
        int first = 0;      //首次出现的位置
        sort(nums.begin(),nums.end());
        for(int i=0;i<len;i++)
        {
            if(nums[i] == val)
            {
                if(tot == 0)
                {
                    first = i;
                }
                tot++;      //先记录相同的个数
            }
        }
        for(int i=first;i<len-tot;i++)
        {
            nums[i] = nums[i+tot];
        }
        return len-tot;
    }
};

思路二:使用两个指针,用pointer指针记录最终位置。9MS AC。

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

思路三:solution栏提供的思路,声称简单并且优化过了,但其实速度非常慢,12MS几乎垫底。

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int cnt = 0;
        for(int i = 0 ; i < nums.size() ; ++i) {
            if(nums[i] == val)
                cnt++;
            else
                nums[i-cnt] = nums[i];
        }
        return nums.size()-cnt;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值