【每日一题】27.移除元素

leet-code 27. 移除元素 https://leetcode-cn.com/problems/remove-element/

解法1 暴力

C++ 实现要注意迭代器失效的问题!
4 ms 6.3 MB

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

解法2 双指针法

类似于 26.删除数组中的重复项

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

解法3 双指针法优化

这个解法是看了题解里面的。
双指针法,当 nums 中只有较少的元素 == val 的时候。方法2中,会将一些元素做不必要的移位操作。

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        size_t n = nums.size();
        size_t i = 0;
        while (i < n) {
            if (nums[i] == val) {
                nums[i] = nums[n - 1];  // 和最后一个有效值交换
                --n;  // 有效元素 - 1
            } else {
                ++i;
            }
        }
        return n;
    }
};

EOF

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值