18.四数之和
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
注意:
答案中不可以包含重复的四元组。
示例: |
---|
给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。 满足要求的四元组集合为: [ [-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2] ] |
一开始我的想法是在外层再嵌套一层L、R双指针,保持N(O^2)的复杂度,但是发现无法确定左右指针移动的时机。导致漏解。
所以直接再嵌套一层循环,复杂度变为N(O^3)
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
int L,R,l,r,temp,n=0;
vector<vector<int>> res;
if(nums.size() < 4) return res;
sort(nums.begin(), nums.end());
for(L = 0; L<nums.size()-3;L++){
for(R = nums.size()-1; R>L;R--){
l=L+1; r=R-1;
while(l<r){
temp = nums[L] + nums[R] + nums[l] + nums[r];
if(temp == target){
res.push_back(vector<int> (4,0));
res[n][0] = nums[L];
res[n][1] = nums[R];
res[n][2] = nums[l];
res[n++][3] = nums[r];
while(l<r && nums[l]==nums[l+1]) l=l+1;
while(l<r && nums[r]==nums[r-1]) r=r-1;
r--;l++;
}
else if(temp > target) r--;
else l++;
}
while (R>L && nums[R] == nums[R-1]) R--;
}
while (L<nums.size()-3 && nums[L] == nums[L+1]) L++;
}
return res;
}
};
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.