20.4.10 2つの数値の合計II-順序付けされた配列への単純な入力

タイトル

昇順で並べ替えられた順序付けられた配列を指定して、2つの数値を見つけ、それらの合計がターゲットの数値と等しくなるようにします。
関数は、これら2つのインデックス値index1とindex2を返す必要があります。index1はindex2より小さい必要があります。

説明:
返される添え字値(index1およびindex2)はゼロから始まりません。
各入力は一意の回答にのみ対応していると想定でき、同じ要素を再利用することはできません。

例:
入力:数値= [2、7、11、15]、ターゲット= 9
出力:[1,2]
説明:2と7の合計は、ターゲットの数値9と等しくなります。したがって、index1 = 1、index2 = 2です。

問題解決のアイデア

  1. 注文しているので二分法が使えます
  2. 数値をindex1として指定し、この数値の後の二分法を使用してindex2を検索します。それが見つからない場合は、index1に変更し、結果が見つかるまでループします。

コードのアイデア

  1. 配列全体をループし、現在のトラバーサル数をindex1として設定し、二分法を使用して、index1の数の後のindex2を見つけます。
  2. 現在の二分法が適切なindex2を見つけることができない場合は、index1を更新します。
  3. index2が見つかると、フラグがtrueになり、whileループとforループが飛び出し、結果が取得されます。

コード

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        vector<int> result;
        if(numbers.size() == 0) return result;

        int index1;
        int index2;
        for(int i = 0; i < numbers.size() - 1; i++){
            index1 = i;
            int begin = i + 1;
            int end = numbers.size() - 1;
            bool flag = false;
            while(begin <= end){
                int mid = (begin + end) / 2;
                if(numbers[index1] + numbers[mid] == target){
                    flag = true;
                    index2 = mid;
                    break;
                }
                if(numbers[index1] + numbers[mid] > target) end = mid - 1;
                if(numbers[index1] + numbers[mid] < target) begin = mid + 1;
            } 
            if(flag) break;
        }
        result.push_back(index1 + 1);
        result.push_back(index2 + 1);

        return result;
    }
};

おすすめ

転載: www.cnblogs.com/wasi-991017/p/12676083.html