题目描述:![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3b23134a578e5cbf895284dfebf2f177.png)
思路:
1
排序 + hash_map + 双指针
对数组排序
将数组中大于0元素放入map
设立双指针I,j
判断 -(nums[i] + nums[j])能否在map中找到,若能找到,则添加如ans否则继续遍历
由于去重不理想,未能全部通过测试
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
if (nums.size() < 3)
return {};
sort(nums.begin(), nums.end());
if (nums[0] > 0 || nums[nums.size()] < 0)
return {};
vector<vector<int>> ans;
unordered_map<int, int> record;
int flag = 1;
for (int i = 0; i < nums.size(); i++)
{
if (nums[i] >= 0)
record[nums[i]] = i;
}
for (int i = 0; i < nums.size(); i++)
{
if (nums[i] <= 0 && nums[i] != flag)
{
for (int j = i + 1; j < nums.size(); j++)
{
if (nums[j] <= 0)
{
int temp = 0 - nums[i] - nums[j];
if (record[temp])
{
ans.push_back({nums[i],nums[j],nums[temp]});
}
}
}
flag = nums[i];
}
}
return ans;
}
};
2.排序 + 双指针
参考题解方法
对数组进行排序
遍历排序后数组
- 若 nums[i]>0nums[i]>0nums[i]>0:因为已经排序好,所以后面不可能有三个数加和等于 000,直接返回结果。
- 对于重复元素:跳过,避免出现重复解
- 令左指针 L=i+1L=i+1L=i+1,右指针 R=n−1R=n-1R=n−1,当 L<RL<RL<R 时,执行循环:
当nums[i] + nums[right] + nums[left] == 0,添加元素,继续循环。
nums[i] + nums[right] + nums[left] < 0,L右移
nums[i] + nums[right] + nums[left] > 0,R左移
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums)
{
vector<vector<int>> ans;
if(nums.size()<3)
return ans;
sort(nums.begin(), nums.end());
if(nums[0]>0 || nums[nums.size() - 1] < 0)
return ans;
int i = 0;
while(i<nums.size()){
int left = i+1, right = nums.size()-1;
while(left< right){
if(nums[i] + nums[left] + nums[right] > 0)
right--;
else if(nums[i] + nums[left] + nums[right] < 0)
left++;
else{
ans.push_back({nums[i], nums[left], nums[right]});
while(left<right&&nums[left]==nums[left+1])
left++;
while(left<right&&nums[right] == nums[right-1])
right--;
left++;
right--;
}
}
while(i+1<nums.size()&&nums[i] == nums[i+1])
i++;
i++;
}
return ans;
}
};