タイトル
昇順で並べ替えられた順序付けられた配列を指定して、2つの数値を見つけ、それらの合計がターゲットの数値と等しくなるようにします。
関数は、これら2つのインデックス値index1とindex2を返す必要があります。index1はindex2より小さい必要があります。
説明:
返される添え字値(index1およびindex2)はゼロから始まりません。
各入力は一意の回答にのみ対応していると想定でき、同じ要素を再利用することはできません。
例:
入力:数値= [2、7、11、15]、ターゲット= 9
出力:[1,2]
説明:2と7の合計は、ターゲットの数値9と等しくなります。したがって、index1 = 1、index2 = 2です。
問題解決のアイデア
- 注文しているので二分法が使えます
- 数値をindex1として指定し、この数値の後の二分法を使用してindex2を検索します。それが見つからない場合は、index1に変更し、結果が見つかるまでループします。
コードのアイデア
- 配列全体をループし、現在のトラバーサル数をindex1として設定し、二分法を使用して、index1の数の後のindex2を見つけます。
- 現在の二分法が適切なindex2を見つけることができない場合は、index1を更新します。
- 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;
}
};