[説明]
列挙ダブルループ[i..j]このセクションでは、
また、それがNUMS [i]とNUMS [j]を取る提供
し、次の質問は今ラベル[i..j] 2見つけるこの図の範囲となりますその数とターゲットNUMSを作るために[I] -nums [ J]。
問題の複雑さはO(N)で解決することが可能です。
複雑さは、したがってある(O(N ^ 3)\
\) コースも(Nミートイン中央Oに書き込まれるの ^ 2) されている
それらの2マップに格納されているものの数X(それぞれ、2および一つとして記憶されています)への添字。
そして、マップサイクルに再び倍増しに行くと、ターゲット・NUMS [i]を-nums [ j]は、 番号のペアです。
そして、マージします。
同じランドマークは、次の(2桁で)除去されています。
[コード]
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int> > ans;
ans.clear();
vector<int> temp;
temp.resize(4);
sort(nums.begin(),nums.end());
int len = nums.size();
for (int i = 0;i < len;i++){
if (i>0 && nums[i]==nums[i-1]) continue;
for (int j = i+3;j<len;j++){
while(j+1<len && nums[j+1]==nums[j]) j++;
//在i..j这个范围内找和为target-nums[i]-nums[j]的数字
int key = target-nums[i]-nums[j];
int l = i+1,r = j-1;
while (l<r){
if (nums[l]+nums[r]>key){
r--;
}else if (nums[l]+nums[r]<key){
l++;
}else {
temp[0] = nums[i];temp[1] = nums[l];
temp[2] = nums[r];temp[3] = nums[j];
ans.push_back(temp);
while (l+1<r && nums[l+1]==nums[l]) l++;
while (r-1>l && nums[r-1]==nums[r]) r--;
l++;r--;
}
}
}
}
return ans;
}
};