小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
题目
给定一个已按照 非递减顺序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target。
函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
示例
输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
输入: numbers = [2,3,4], target = 6
输出: [1,3]
输入: numbers = [-1,0], target = -1
输出: [1,2]
提示
2 <= numbers.length <= 3 * 10^4- `-1000 <= numbers[i] <= 10001
numbers按 非递减顺序 排列-1000 <= target <= 1000- 仅存在一个有效答案
解题思路
双指针
这算是最基础的双指针模版了,定义好左右边界之后,逐位向中间移动,得到结果并返回。
class Solution {
public int[] twoSum(int[] numbers, int target) {
// 定义左右两个指针,left,right 注意边界为[0, n - 1]
int left = 0, right = numbers.length - 1;
// 题目要求不能使用相同元素,这里终止条件为left小于right
while(left < right){
// 相加结果大于目标值,则右边指针左移
if(numbers[left] + numbers[right] > target){
--right;
}else if(numbers[left] + numbers[right] < target){
// 相加结果小于目标值,则左边指针右移
++left;
}else{
// 找到目标值,这里记得索引需要各自 +1,因为题目中说明是从1开始而不是从0开始
return new int[]{left + 1, right + 1};
}
}
return new int[0];
}
}
复杂度分析
- 时间复杂度:
- 空间复杂度:
最后
文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!
如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!