【每日一题】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

发布了98 篇原创文章 · 获赞 91 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/Hanoi_ahoj/article/details/105354674