是3Sum算法的繼承,只是多了一個循環。3Sum算法要多練習。
代碼:
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> result;
if(nums.size()<4) return result;
sort(nums.begin(),nums.end());
int i=0,j=0,k=0,l=0,aim=0,sum=0,len=nums.size();
for(i=0;i<len-3;i++)
{
for(j=i+1;j<len-2;j++)
{
k=j+1;
l=len-1;
aim=target-nums[i]-nums[j];
while(k<l)
{
sum=nums[k]+nums[l];
if(sum<aim) k++;
else if(sum>aim) l--;
else
{
vector<int> temp;
temp.push_back(nums[i]);
temp.push_back(nums[j]);
temp.push_back(nums[k]);
temp.push_back(nums[l]);
result.push_back(temp);
while(k<l&&nums[k]==temp[2]) k++;
while(k<l&&nums[l]==temp[3]) l--;
}
}
while(nums[j+1]==nums[j]) j++;
}
while(nums[i+1]==nums[i]) i++;
}
return result;
}
};
看到一個比較優質的算法,即在i,j循環開始的時候,先判斷i和j是否合適,然後再進行接下來的循環。多加幾個判斷條件,速度提升很多:
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> result;
if(nums.size()<4) return result;
sort(nums.begin(),nums.end());
int i=0,j=0,k=0,l=0,aim=0,sum=0,len=nums.size();
for(i=0;i<len-3;i++)
{
if(nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target) break;
if(nums[i]+nums[len-3]+nums[len-2]+nums[len-1]<target) continue;
for(j=i+1;j<len-2;j++)
{
if(nums[i]+nums[j]+nums[j+1]+nums[j+2]>target) break;
if(nums[i]+nums[j]+nums[len-2]+nums[len-1]<target) continue;
k=j+1;
l=len-1;
aim=target-nums[i]-nums[j];
while(k<l)
{
sum=nums[k]+nums[l];
if(sum<aim) k++;
else if(sum>aim) l--;
else
{
vector<int> temp;
temp.push_back(nums[i]);
temp.push_back(nums[j]);
temp.push_back(nums[k]);
temp.push_back(nums[l]);
result.push_back(temp);
while(k<l&&nums[k]==temp[2]) k++;
while(k<l&&nums[l]==temp[3]) l--;
}
}
while(nums[j+1]==nums[j]) j++;
}
while(nums[i+1]==nums[i]) i++;
}
return result;
}
};