1、大家普遍的第一想法就是三个for循环,刚开始我也是这么做的,很遗憾,时间必超
2、算法思路:夹逼准则 时间复杂度为O(n^2)
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;
if(nums.size()<3)
return result;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size()-2;++i){
if(i==0||i>0&&nums[i]!=nums[i-1]){
int m=i+1;
int n=nums.size()-1;
int sum=nums[i]+nums[m]+nums[n];
while(m<n){
if(sum==0){
vector<int> temp;
temp.push_back(nums[i]);
temp.push_back(nums[m]);
temp.push_back(nums[n]);
result.push_back(temp);
while(m<n&&nums[m]==nums[m+1]){
++m;
}
while(m<n&&nums[n]==nums[n-1]){
--n;
}
++m;
--n;
sum=nums[i]+nums[m]+nums[n];
}
else if(sum<0){
++m;
sum=nums[i]+nums[m]+nums[n];
}else{
--n;
sum=nums[i]+nums[m]+nums[n];
}}
}
}
return result;
}
};
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int size=nums.size();
vector<vector<int>> result;
if(size<3)
return result;
sort(nums.begin(),nums.end());
for(int i=0;i<size-2;++i){
if(i==0 || (i>0&&nums[i] != nums[i-1]) ){
int m=i+1;
int n=size-1;
int sum=0-nums[i];
while(m<n){
if(sum==nums[m]+nums[n]){
vector<int> temp;
temp.push_back(nums[i]);
temp.push_back(nums[m]);
temp.push_back(nums[n]);
result.push_back(temp);
while(m<n && nums[m]==nums[m+1]){
++m;
}
while(m<n & nums[n]==nums[n-1]){
--n;
}
m++;
n--;
}
else if(sum>nums[m]+nums[n]){
m++;
}
else{
n--;
}
}
}
}
return result;
}
};