题目
给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。
函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 0 开始计数 ,所以答案数组应当满足 0 <= answer[0] < answer[1] < numbers.length 。
假设数组中存在且只存在一对符合条件的数字,同时一个数字不能使用两次。
示例 1:
输入:numbers = [1,2,4,6,10], target = 8
输出:[1,3]
解释:2 与 6 之和等于目标数 8 。因此 index1 = 1, index2 = 3 。
示例 2:
输入:numbers = [2,3,4], target = 6
输出:[0,2]
示例 3:
输入:numbers = [-1,0], target = -1
输出:[0,1]
提示:
2 <= numbers.length <= 3 * 104
-1000 <= numbers[i] <= 1000
numbers 按 递增顺序 排列
-1000 <= target <= 1000
仅存在一个有效答案
分析
使用双指针的方式:
一个指向第一个位置,一个指向第二个位置。
因为是排好序的,那么当两个指针相加大于目标值的时候,将右边的指针左移;当小于目标值的时候,将左边的指针右移
代码
里面查考了书上的代码,然后自己重新又敲了一遍。
里面注释很清楚
class Solution {
public int[] twoSum(int[] numbers, int target) {
// 定义双指针,头尾指针
int left=0;
int right=numbers.length-1;
// 迭代遍历[ && left < right此条件在该情况中可以不加]
while(numbers[left]+numbers[right] != target && left < right){
// 由于是排好序的。那么相加小于目标值,将左指针右移动;当大于目标值时,将右指针左移
if(numbers[left]+numbers[right] < target){
left++;
}else{
right--;
}
}
return new int[] {left,right};
}
}
二刷
class Solution {
// 数组、排好序、两数和=》反向双指针(一个指向头,一个指向尾)
public int[] twoSum(int[] numbers, int target) {
// 判空
if(numbers.length == 0){
return null;
}
// 定义双指针
int p1 = 0;
int p2 = numbers.length - 1;
// 定义返回值
int[] res = new int[2];
// 可以这样去移动,前提是因为这是排好序的
while(p1 < p2){
// 大于目标值,右指针左移
if(numbers[p1] + numbers[p2] > target){
p2 --;
}
// 小于目标值,左指针右移动
if(numbers[p1] + numbers[p2] < target){
p1 ++;
}
// 相等直接返回
if(numbers[p1] + numbers[p2] == target){
res[0] = p1;
res[1] = p2;
break;
}
}
return res;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/96224.html