3 sum問題
1164 ワード
配列を指定し、3つの数を0に加算したすべての組合せを見つけます.
例えば、0,1,−1,4,5,3,−7を与える
組み合わせは0,-1,1である.3, 4,-7
問題を解く構想:ここではa+b+c=0を要求し、a+b=-cを満たすだけでよい.まず配列をインクリメント順に並べ替え、ループすることで現在数が0より大きいとループから飛び出します.なお、現在数が前の数と等しく、現在数が0より大きい場合は、判断を続ける必要はなく、直接次の数にジャンプするだけでよい.
例えば、0,1,−1,4,5,3,−7を与える
組み合わせは0,-1,1である.3, 4,-7
問題を解く構想:ここではa+b+c=0を要求し、a+b=-cを満たすだけでよい.まず配列をインクリメント順に並べ替え、ループすることで現在数が0より大きいとループから飛び出します.なお、現在数が前の数と等しく、現在数が0より大きい場合は、判断を続ける必要はなく、直接次の数にジャンプするだけでよい.
vector> threeSum(vector& nums) {
vector> res;
sort(nums.begin(), nums.end());
for (int k = 0; k < nums.size(); ++k) {
if (nums[k] > 0) break;
if (k > 0 && nums[k] == nums[k - 1]) continue; // , ,
int target = 0 - nums[k];
int i = k + 1, j = nums.size() - 1;
while (i < j) {
if (nums[i] + nums[j] == target) {
res.push_back({nums[k], nums[i], nums[j]});
while (i < j && nums[i] == nums[i + 1]) ++i;
while (i < j && nums[j] == nums[j - 1]) --j;
++i; --j;
} else if (nums[i] + nums[j] < target) ++i;
else --j;
}
}
return res;
}