2023-07-08 LeetCode 毎日の質問 (2 つの数値の合計 II - 入力順序配列)

2023-07-08 1 日 1 つの質問

1. トピック番号

167. 两数之和 II - 输入有序数组

2. トピックリンク

クリックするとトピックの場所にジャンプします

3. トピックの説明

添字が1から始まる整数の配列番号が与えられます。配列は非降順に並べられています。合計の合計が目標の数値 target に等しくなる 2 つの数値を配列から見つけてください。これら 2 つの数値がそれぞれnumber[index1]とnumbers[index2]である場合、1 <=index1<index2<=numbers.lengthになります。

これら 2 つの整数のインデックス Index1 と Index2 を、長さ 2 の整数の配列 [index1, Index2] として返します。

各入力は一意の回答に対応すると想定でき同じ要素を再利用することはできません。

設計するソリューションでは、一定量の追加スペースのみを使用する必要があります。

ヒント:

  • 2 <= 数値.長さ <= 3 * 10 4
  • -1000 <= 数値[i] <= 1000
  • 降順でない数値
  • -1000 <= ターゲット <= 1000
  • 有効な答えは 1 つだけ存在します

4. 問題解決コード

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

5、問題解決のアイデア

(1)ダブルポインターを使用して問題を解きます。

(2) 配列全体の長さを n として記録します。左ポインタ left は、最初は配列内の添字が 0 である場所を指し、右ポインタ right は配列内の添字が n-1 である場所を指します。 。nums[left] + nums[right] が target と等しい場合、要件を満たします。nums[left] + nums[right] が target より小さい場合、値を増やす必要があり、nums の場合は、left を +1 する必要があります。 [left] + nums[right] ] はターゲットより大きいため、値を減らす必要があり、right は 1 減らす必要があります。

(3) 最後に、結果の配列の添字は元の配列の添字 + 1 である必要があることを忘れないでください。

おすすめ

転載: blog.csdn.net/qq_56086076/article/details/131607369