校友網(wǎng)站 建設/強力搜索引擎
1. 題目
給你一個由?
n
?個整數(shù)組成的數(shù)組?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
你可以按?任意順序?返回答案 。
2. 示例
3. 分析
做這題之前先做這道:三數(shù)之和,對應題解:三數(shù)之和 - 題解
四數(shù)之和無非就是再多套一層循環(huán),即再增加一個固定數(shù)。之后就利用雙指針尋找 兩數(shù)之和 == target - 第一個固定數(shù) - 第二個固定數(shù):
class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {sort(nums.begin(), nums.end());vector<vector<int>> ret;int n = nums.size();for(int i = 0; i < n;) // 第一個固定數(shù){for(int j = i + 1; j < n;) // 第二個固定數(shù){// 雙指針int left = j + 1, right = n - 1;long long aim = (long long)target - nums[i] - nums[j];while(left < right){int sum = nums[left] + nums[right];if(sum > aim) right--;else if(sum < aim) left++;else{ret.push_back({nums[i], nums[j], nums[left++], nums[right--]});while(left < right && nums[left] == nums[left-1]) left++; // 去重左指針元素while(right < right && nums[right] == nums[right+1]) right--; // 去重右指針元素}}j++;while(j < n && nums[j] == nums[j-1]) j++; // 去重第二個固定數(shù)指針元素}i++;while(i < n && nums[i] == nums[i-1]) i++; // 去重第一個固定數(shù)指針元素}return ret;}
};