[アルゴリズム トピック ブレークスルー] ダブル ポインター - 3 つの数値の合計 (7)

目次

1. 質問分析

2. アルゴリズム原理

3. コードの書き方

最後に次のように書きます。


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;
    }
};

最後に次のように書きます。

以上がこの記事の内容です、読んでいただきありがとうございます。

何かを得たと感じたら、ブロガーに「いいね! 」を与えることができます。

記事の内容に漏れや間違いがある場合は、ブロガーにプライベートメッセージを送信するか、コメント欄で指摘してください〜

おすすめ

転載: blog.csdn.net/Locky136/article/details/131633442
おすすめ