题目描述
给定一个已按照 升序排列 的整数数组 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]
解法1(暴力破解)
这应该是比较简单的一种方法,应该是有手就行,在此不再赘述,只需遍历所有的可能即可。
解法2(二分法)
总体思路
题目中的升序二字使得我们不由得想到二分法,解法2主要是使用二分法进行解决,其思路也很简单,也是需要遍历整个数组,当遍历到每个元素时都在数组中使用二分法搜索目标值减去该元素的值,如果可以找得到,则说明该下标组合符合要求,否则不符合,继续遍历下一个元素,直至找到符合要求的组合,当然在实现具体代码时还需要考虑一些细节,比如在所给数组中出现相同元素值的情况。
代码实现
public static int[] twoSum(int[] numbers, int target) {
//创建一个数组用于保存要返回的结果
int[] answers = new int[2];
//遍历数组中所有的元素
for (int i=0;i<numbers.length;i++){
//为避免重复元素,从下一个元素开始搜索
int another = Arrays.binarySearch(numbers,i+1,numbers.length,target - numbers[i]);
//如果搜索到所需值则赋值给目标数组并返回
if (another >=0 && another!=i){
answers[0] = i;
answers[1] = another;
break;
}
}
return answers;
}
运行结果
1.示例1运行结果
2.示例2运行结果
3.示例3运行结果
结果分析
解法2还是比较容易理解的,而且实现起来也并不困难,甚至连二分查找我都用的是java自带的,简直不要太爽,最后的提交结果如下。
总结
总体来说,本题难度不大,在leetcode中也是属于简单题的类型,可见leetcode对于题目的归类还是有一定的科学依据的。