今天刷leetcode的每日一题,三数之和
在对结果进行去重的时候,使用了unique + erase函数,卡在了第123个样例上,
所以我这个去重函数是生效了,但是不彻底?
是部分生效了,还有几个没去掉,看着像是 最后的数据没有遍历到,看看逻辑上是不是跳过了一些数据处理的???
nums.erase(it)
之后,it就变成了一个野指针,使用 it = nums.erase(it);
避免出现野指针。nums.end()
上执行 ++ 操作,会出现错误。加入if判断解决。 if (val == *it)
it = nums.erase(it);
else
it++;
# include "bits/stdc++.h"
using namespace std;
int main() {
vector<int> nums;
for (int i = 0; i < 3; i++) {
nums.push_back(i);
nums.push_back(i);
}
int val = 1;
for (auto it = nums.begin(); it != nums.end();) {
cout << *it << endl;
if (val == *it)
it = nums.erase(it);
else
it++;
}
cout << nums.size();
return 0;
}
对于题目中提到的去除vector中的重复元素的问题,可以使用STL中的erase和unique函数来完成。
erase函数接受一个迭代器参数,用于指定要删除的元素。对于vector,可以使用erase-remove的惯用法来删除重复元素。具体步骤如下:
下面是具体的代码示例:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> nums = {1, 2, 2, 3, 3, 3, 4, 4, 5};
std::sort(nums.begin(), nums.end()); // 排序
auto it = std::unique(nums.begin(), nums.end()); // 去重,并返回不重复元素的尾后迭代器
nums.erase(it, nums.end()); // 删除重复元素
for (int num : nums) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
输出结果为: 1 2 3 4 5
这样就可以彻底去除vector中的重复元素了。 注意,这个方法只适用于排序后的vector。如果不排序,那么unique函数无法正确去除重复元素。所以在应用unique函数之前,需要确保vector已经被排序。