解决方案:双指针
- 三数之和:力扣15题
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<vector<int>> _vector;
for(int i=0;i<nums.size();i++){
if(nums[i]>0)//剪枝处理
break;
if(i>0&&nums[i]==nums[i-1])//对第一个数去重
continue;
int left=i+1;
int right=nums.size()-1;
while(left<right){
int num=nums[i]+nums[left]+nums[right];
if(num<0){
left++;//窗口左边界右缩
}else if(num>0){
right--;//窗口右边界左缩
}else{
_vector.push_back({nums[i],nums[left],nums[right]});
while(right>left&&nums[left]==nums[left+1])//对第二个数去重
left++;
while(right>left&&nums[right]==nums[right-1])//对第三个数去重
right--;
//收缩窗口
left++;
right--;
}
}
}
return _vector;
}
};
- 四叔之和:力扣18题
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
vector<vector<int>> _vector;
for(int k=0;k<nums.size();k++){
if(nums[k]>=0&&nums[k]>target)//一级剪枝
break;
if(k>0&&nums[k]==nums[k-1])//对第一个数去重
continue;
for(int i=k+1;i<nums.size();i++){
if(nums[k]+nums[i]>0&&nums[k]+nums[i]>target)//二级剪枝
break;
if(i>k+1&&nums[i]==nums[i-1])//对第二个数去重
continue;
int left=i+1;
int right=nums.size()-1;
while(left<right){
long long num=(long)nums[k]+nums[i]+nums[left]+nums[right];
if(num>target)
right--;
else if(num<target)
left++;
else{
_vector.push_back({nums[k],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--;
}
}
}
}
return _vector;
}
};