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