题干:
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意: 答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]
思路:
首先是想着使用集合,目的是为了在三元组集合中的去重。但是后面反应过来如果使用unorder_set来存储元素的话会导致本来出现了两次——即可以使用两次的元素只能使用一次的,不符合语义。
然后就改成unordered_multiset了。但是又会突然反应过来,这样过不了测例的原因在于这样就限制不了结果三元组中的去重了!
所以感受到了鱼和熊掌不可兼得、这手放下那手抬起的无力感。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
unordered_multiset<int> uomset;
vector<vector<int>> result;
for(int element: nums){
uomset.insert(element);
}
for(auto element: uomset){
cout << "element: " << element << endl;
}
for(auto iti = uomset.begin(); iti != uomset.end(); iti++){
auto ititemp = iti;
for(auto itj = ++ititemp; itj != uomset.end(); itj++){
auto itjtemp = itj;
int residual = 0 - *iti - *itj;
unordered_multiset<int> partial_uomset(++itjtemp, uomset.end());
auto itk = partial_uomset.find(residual);
cout << "compute the residual: " << residual << endl;
if(itk == uomset.end()){
continue;
}
else{
vector<int> temp{*iti, *itj, *itk};
result.push_back(temp);
cout << "push_back" << endl;
}
}
}
return result;
}
};
看了一下正解,首先第一步是sort,这应该就规避了很多东西。
但是尝试了一下set解决还是好的,探索到了很多迭代器iterator的操作。
正解:
明天搞清楚了再更新吧。
3368

被折叠的 条评论
为什么被折叠?



