题目描述:
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
基本思路 :最简单的思路就是使用 三层循环,但是时间会超。
我的想法是先对nums做一个排序,接着第一个元素从[ 0 , length-2 ] 寻找,第二个元素和第三个元素利用双指针方法找,这样做复杂度就可以达到O(n^2)。但是还要考虑去重,我用了两个限制。(1) 前面的元素匹配完以后,后面的元素如果和前面的元素相同,那么可以跳过,比如 [ -1,-1 ,0 , 0, 1 ,-2 , 2],第一个 - 1 匹配完以后,第二个 -1 就没必要了,肯定会重.。(2). 第二种就是在双指针移动的时候,匹配出来一个结果要不要往结果中加,需要考虑前面的结果中有没有,因此我建立了一个unordered_map用于存储每一个nums[left] , 这样可以避免增加边界判断 。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int> > res;
int l=nums.size();
sort(nums.begin(),nums.end());
for(int i=0;i<l-2;i++)
{
if(i>0 && nums[i]==nums[i-1])
{
continue;
}
unordered_map<int,int> map;
int left=i+1,right=l-1;
while(left<right)
{
int add = nums[left]+nums[right]+nums[i];
if(add==0)
{
if(map.count(nums[left])==0)
{
vector<int> t;
t.push_back(nums[left]); t.push_back(nums[right]); t.push_back(nums[i]);
res.push_back(t);
}
map[nums[left]]=1;
left++,right--;
}
else if(add>0)
{
right--;
}
else if(add<0)
{
left++;
}
}
}
return res;
}
};
知识点:
C++中algorithm定义了sort()函数可以对数组进行排序,规则可以自己定义。底下是例子
#include<iostream>
#include<algorithm>
using namespace std;
bool complare1(int a,int b)
{
return a < b;
}
bool complare2(int a,int b)
{
return a > b;
}
int main()
{
int a[10]={9,6,3,8,5,2,7,4,1,0};
for(int i=0;i<10;i++)
cout<<a[i]<<" ";
cout<<endl;
sort(a,a+10,complare1);
for(int i=0;i<10;i++)
cout<<a[i]<<" ";
cout<<endl;
sort(a,a+10,complare2);
for(int i=0;i<10;i++)
cout<<a[i]<<" ";
return 0;
}