目次
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;
}
};
最後に次のように書きます。
以上がこの記事の内容です、読んでいただきありがとうございます。
何かを得たと感じたら、ブロガーに「いいね! 」を与えることができます。
記事の内容に漏れや間違いがある場合は、ブロガーにプライベートメッセージを送信するか、コメント欄で指摘してください〜