[アルゴリズムトピックのブレークスルー] ダブルポインター - 合計が s となる 2 つの数値 (6)

目次 

1. 質問分析

2. アルゴリズム原理

3. コードの書き方

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


1. 質問分析

質問リンク: Sword は Offer 57 を指します。合計が s である 2 つの数字 - Leetcode

 この質問には 1 文しかありませんが、抽出できる情報があります。

最も重要なのは、冒頭の「増加する順序」という文です。

次に、配列内で合計が s となる 2 つの数値を見つけます (任意のペアにすることができます)。

2. アルゴリズム原理

この質問は非常に単純です。総当たり列挙を使用し、2 層の for ループを直接使用してそれを解決すると、

しかし、強引なソリューションを使用すると、それが順序付けされたシーケンスであるという事実を利用できなくなります。

秩序を見るとき、私たちは通常、二分法を使用することを考えますが、二分法を書くのはさらに困難です。

したがって、単調性を使用し、ダブルポインターを使用してこの問題を解決する予定です。

左ポインタを使用して左を指し、右ポインタを使用して右を指し、操作を開始します。

合計は左 + 右の値です。

合計 < ターゲットの場合、左ポインタを右に移動して、より大きな数値を見つけます。

合計 > ターゲットの場合、右ポインタを左に移動して小さい数値を見つけます。

sum == target の場合は、結果のみを返します。

3. コードの書き方

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int left = 0, right = nums.size() - 1;
        vector<int> ans;
        while(left < right) {
            int sum = nums[left] + nums[right];
            if(sum < target) left++;
            else if(sum > target) right--;
            else {
                ans.push_back(nums[left]);
                ans.push_back(nums[right]);
                break;
            }
        }
        return ans;
    }
};

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

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

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

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

おすすめ

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