18. 四数之和
18. 四数之和
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
0 <= a, b, c, d < na、b、c和d互不相同nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。
同三数之和
增加一个循环判断第二个数就可(long转换类型防止溢出)
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> res;
sort(nums.begin(),nums.end());
int n = nums.size();
if(n < 4) return res;
for(int i =0; i < n-3 ;i++){
if((long)nums[i] + nums[i+1] + nums[i+2] + nums[i+3] > target) break;
if(i> 0 && (nums[i] == nums[i-1])) continue;//避免重复
if((long)nums[i] +nums[n-1] + nums[n-2] + nums[n-3] < target) continue;
for(int j=i+1 ; j< n-2 ;j++){
if((long)nums[i] + nums[j] + nums[j+1] + nums[j+2] > target) break;
if(j>i+1 && (nums[j] == nums[j-1])) continue;
if((long)nums[i] + nums[j] + nums[n-1] + nums[n-2] < target) continue;
int l=j+1,r=n-1;
while(l < r){
long sum = (long)nums[i] + nums[j] + nums[l] + nums[r];
if(sum == target){
res.push_back({nums[i],nums[j],nums[l],nums[r]});
while(l < r && (nums[l] == nums[l+1])) l++;
while(l < r && (nums[r] == nums[r-1])) r--;
l++;
r--;
}
else if(sum < target){
l++;
}
else{
r--;
}
}
}
}
return res;
}
};

浙公网安备 33010602011771号