三数之和
首先对数组进行排序,接着我们用双指针来解决元素的查找问题。
若nums[left]+nums[right]+nums[i]<0
说明left过小,所以left++
;
若nums[left]+nums[right]+nums[i]>0
说明right过大,所以right--
;
如果相等就按照值从小到大依次存入数组。
接着需要去除重复的元素,如果有重复则跳过该元素:依次对left,right和i进行去重。
解决代码:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
if(nums.size()<3) return {};//特殊情况
vector<vector<int>> sum;
sort(nums.begin(),nums.end());
int left=0,right=nums.size()-1;
for(int i=0;i<nums.size();i++)
{
left=i+1,right=nums.size()-1;
while(left<right)
{
if(nums[left]+nums[right]+nums[i]<0)
{
left++;
}
else if(nums[left]+nums[right]+nums[i]>0)
{
right--;
}
else
{
sum.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++;
}
}
return sum;
}
};