目次
1. 質問分析
質問リンク: 15. 3 つの数値の合計 - Leetcode
問題は、合計が 0 である反復しないトリプルを見つけることです。
トリプルの各要素は異なる位置にあることに注意してください。では、繰り返さないとはどういう意味でしょうか?
最初の例を見てみましょう。
彼はトリプルを 3 つ見つけましたが、返したのは 2 つだけでした。
つまり、同じ要素を持つトリプルは同じトリプレットとみなされます。(そうでない場合は、空のセットが返されます。)
2. アルゴリズム原理
最初のアイデアはもちろん、総当たりの列挙です。具体的には、
最初に並べ替え、次に激しく列挙し、最後に set を使用して重複を削除します。
次に、N3 の暴力的な列挙を最適化する方法を考えなければなりません。
ソート後は、順序付けされた配列が作成されます。次に、最適化のためにバイナリ ポインタを使用するかダブル ポインタを使用するかを考慮する必要があります。もちろん、ダブル ポインタが優先されます。
具体的な解決策を見てみましょう。
i 位置を修正します。
ダブルポインターを使用して、左の位置と右の位置の合計が 4 になる位置をすばやく見つける必要があるだけです。
3. コードの書き方
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ans;
sort(nums.begin(), nums.end());
for(int i = 0; i < nums.size() - 2; i++) {
int left = i + 1, right = nums.size() - 1;
while(left < right) {
int sum = nums[i] + nums[left] + nums[right];
if(sum < 0) left++;
else if(sum > 0) right--;
else { // sum == 0
ans.push_back({nums[i], nums[left], nums[right]});
while(left < right && nums[left] == nums[left + 1]) left++;
while(left < right && nums[right] == nums[right - 1]) right--;
left++, right--;
}
}
while(i < nums.size() - 2 && nums[i] == nums[i + 1]) i++;
}
return ans;
}
};
最後に次のように書きます。
以上がこの記事の内容です、読んでいただきありがとうございます。
何かを得たと感じたら、ブロガーに「いいね! 」を与えることができます。
記事の内容に漏れや間違いがある場合は、ブロガーにプライベートメッセージを送信するか、コメント欄で指摘してください〜