题目:https://leetcode-cn.com/problems/4sum/
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] :
0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。
我的方法一,4指针
和https://leetcode-cn.com/problems/3sum/
三个数之和类似,也是先排序,只是4个数时,先固定2个数,移动另外两个指针,让和等于target
复杂度
时间:O(nxnxn),因为3层循环
空间:O(1)
代码
注意点
- 去重
- 4个int相加可能存在超过int最大值的问题,所以求和时要转为64位(long long)
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> ret;
//O(nlogn)
sort(nums.begin(), nums.end());
int n = nums.size();
long long sum;
int left;
int right;
//total O(nxnxn)
//O(n)
for(int i = 0; i < n; i++) {
if(i > 0) {
if(nums[i] == nums[i - 1]){
continue;
}
}
//O(n)
for(int j = i + 1; j < n; j++) {
if(j > i + 1) {
if(nums[j] == nums[j - 1]){
continue;
}
}
left = j + 1;
right = n - 1;
//O(n)
while(left < right) {
if(left > j + 1) {
if(nums[left] == nums[left - 1]){
left++;
continue;
}
}
if(right < n - 1) {
if(nums[right] == nums[right + 1]){
right--;
continue;
}
}
sum = (long long)nums[i] + (long long)nums[j] + (long long)nums[left] + (long long)nums[right];
if(sum == target) {
vector<int> tmp;
tmp.push_back(nums[i]);
tmp.push_back(nums[j]);
tmp.push_back(nums[left]);
tmp.push_back(nums[right]);
ret.push_back(tmp);
left++;
}else if(sum < target) {
left++;
}else{
right--;
}
}
}
}
return ret;
}
};