006 Leetcode 167 排序数组中两数字之和
给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。
函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 0 开始计数 ,所以答案数组应当满足 0 <= answer[0] < answer[1] < numbers.length 。
假设数组中存在且只存在一对符合条件的数字,同时一个数字不能使用两次。
来源:力扣(LeetCode) 链接:力扣
题解:双指针
class Solution { public int[] twoSum(int[] numbers, int target) { int n = numbers.length; int x = 0, y = n-1; while(x<y){ if((numbers[x]+numbers[y]) == target){ return new int[]{x,y}; } if((numbers[x]+numbers[y]) > target){ y--; } if((numbers[x]+numbers[y]) < target){ x++; } } return new int[]{-1,-1}; } }
优化:双指针+二分
class Solution { public int[] twoSum(int[] numbers, int target) { int i = 0, j = numbers.length - 1; while (i < j) { int m = (i + j) / 2; if (numbers[i] + numbers[m] > target) { j = m - 1; } else if (numbers[m] + numbers[j] < target) { i = m + 1; } else if (numbers[i] + numbers[j] > target) { j--; } else if (numbers[i] + numbers[j] < target) { i++; } else { return new int[]{i + 1, j + 1}; } } return new int[]{0, 0}; } }