2023-07-08每日一题
一、题目编号
167. 两数之和 II - 输入有序数组
二、题目链接
点击跳转到题目位置
三、题目描述
给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。
以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
你所设计的解决方案必须只使用常量级的额外空间。
提示:
- 2 <= numbers.length <= 3 * 104
- -1000 <= numbers[i] <= 1000
- numbers 按 非递减顺序 排列
- -1000 <= target <= 1000
- 仅存在一个有效答案
四、解题代码
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;
}
};
五、解题思路
(1) 运用双指针来解决问题。
(2) 记录整个数组的长度为n,左指针left一开始指向数组中下标为0的地方,右指针right指向数组中下标为n-1的地方。如果nums[left] + nums[right] 等于 target则符合要求,如果nums[left] + nums[right] 小于target,则值要增大,则left应当+1,如果nums[left] + nums[right]大于target的话,则值要减小,则right应当减1。
(3) 最终不要忘记结果数组的下标应当是原数组下标+1。