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

目次

1. 質問分析

2. アルゴリズム原理

3. コードの書き方

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


1. 質問分析

質問リンク: 18. 4 つの数値の合計 - Leetcode

 この問題は 3 つの数字の合計と同じです。

質問は分かりやすく、4つの数字の合計が目標に等しい状況です。

そして、これら 4 つの数字を繰り返すことはできません。

2. アルゴリズム原理

1つ目は暴力的な解決策です。

ソート + 暴力的な列挙 + セットの重複排除

もちろん、最適化されたソリューションを使用します。

1. 数値 a を順番に固定します

2. 次に、次の区間で、合計がターゲットとなる数値を見つけます - a

3. 3 つの数の和も固定数 b であり、その和がターゲット - a - b となる数を求めます。

ただし、重複する要素はスキップする必要があることにも注意する必要があります。

3. コードの書き方

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, long long target) {
        int size = nums.size();
        vector<vector<int>> ans;
        sort(nums.begin(), nums.end());
        for(int i = 0; i < size - 3; i++) {
            int a = nums[i];
            for(int j = i + 1; j < size - 2; j++) {
                int b = nums[j];
                int left = j + 1, right = size - 1;
                while(left < right) {
                    int sum = nums[left] + nums[right];
                    if(sum < target - a - b) left++;
                    else if(sum > target - a - b) right--;
                    else { // sum == target - a - b
                        ans.push_back({nums[i], nums[j], 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(j < size - 2 && nums[j] == nums[j + 1]) j++;
            }
            while(i < size - 3 && nums[i] == nums[i + 1]) i++;
        }
        return ans;
    }
};

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

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

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

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

おすすめ

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