题目
题目描述
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 a + b + c = 0 a+b+c=0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
题解
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<pair<int,int> > M;
sort(nums.begin(),nums.end());
vector<vector<int>> res;
for(int i = 0;i < nums.size();i++){
for(int j = i + 1;j < nums.size();j++){
int t = 0 - nums[i] - nums[j];
if(binary_search(nums.begin() + j + 1,nums.end(),t)){
pair<int,int> u = {nums[i],nums[j]};
if(!binary_search(M.begin(),M.end(),u)){
res.push_back(vector({nums[i],nums[j],t}));
M.push_back(u);
}
}
}
}
return res;
}
};
我使用了二分降低了时间复杂度。
因为题目要求不能有重复的三元组,例如:(-1,0,1)
和(1,0,-1)
。
但需要注意,这里并不能通过提前将nums
中的元素去重来实现三元组的去重。因为类似(1,1,-2)
的三元组也是可行的解。
所以只能在找出三元组之后在对三元组进行去重。
我增加了一个pair
类型的M
数组,用来存储每一个三元组的前两个元素。
因为一开始使用了sort
函数对nums
进行了排序,所以找出的每一个三元组必定是升序的,因此记录每个找出的三元组的前两个元素,即可实现对三元组的去重。
原创不易,感谢支持。