題目描述
給你一個下標從?1?開始的整數數組?numbers
?,該數組已按?非遞減順序排列??,請你從數組中找出滿足相加之和等于目標數?target
?的兩個數。如果設這兩個數分別是?numbers[index1]
?和?numbers[index2]
?,則?1 <= index1 < index2 <= numbers.length
?。
以長度為 2 的整數數組?[index1, index2]
?的形式返回這兩個整數的下標?index1
?和?index2
。
你可以假設每個輸入?只對應唯一的答案?,而且你?不可以?重復使用相同的元素。
你所設計的解決方案必須只使用常量級的額外空間。
示例 1:
輸入:numbers = [2,7,11,15], target = 9 輸出:[1,2] 解釋:2 與 7 之和等于目標數 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
示例 2:
輸入:numbers = [2,3,4], target = 6 輸出:[1,3] 解釋:2 與 4 之和等于目標數 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3] 。
示例 3:
輸入:numbers = [-1,0], target = -1 輸出:[1,2] 解釋:-1 與 0 之和等于目標數 -1 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
提示:
2 <= numbers.length <= 3 * 104
-1000 <= numbers[i] <= 1000
numbers
?按?非遞減順序?排列-1000 <= target <= 1000
- 僅存在一個有效答案
解決方案:
1、首尾兩頭向中間遍歷,循環遍歷
2、比較大小,決定左側先移動還是右側先移動
函數源碼:
class Solution { public:vector<int> twoSum(vector<int>& numbers, int target) {int l= 0, r = numbers.size() - 1, sum=0;while (l < r) {sum = numbers[l] + numbers[r];if (sum == target) break;if (sum < target) ++l;else --r;}return vector<int>{l + 1, r + 1};} };