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 である必要があることを忘れないでください。