前言
个人网站
公众号: 北京程序猿, 网站 : https://yaml.vip
算法题
题干
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明
- 返回的下标值(index1 和 index2)不是从零开始的。
- 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例
输入: number = [2, 7, 11, 15], target = 9,输出: [1,2]
解释: 2 与 7之和等于目标数 9 。因此 index1 = 1, index2 = 2
解法
- 暴力破解
- 单指针+HashMap
- 前后两指针
复杂度
- 时间复杂度O(N^2)
- 时间复杂度O(N), 空间复杂度O(N)
- 时间复杂度O(N)
Java代码
public static int[] twoSum(int[] array, int target) {
if (array == null || array.length <= 1) {
return new int[2];
}
final int length = array.length;
int frontCursor = 0, backCursor = length - 1;
while (frontCursor < backCursor) {
int frontValue = array[frontCursor];
int minusValue = target - array[backCursor];
if (frontValue == minusValue) {
return new int[]{frontCursor + 1, backCursor + 1};
}
if (frontValue < minusValue) {
frontCursor++;
continue;
}
backCursor--;
}
return new int[2];
}
思考题
- 第九行代码为何用减法?
- 题目中有几个限定条件,如果限定条件去掉,代码该如何写?
- 答案不唯一?
- 数字可以重复利用?
- 是否可以用二分法去解该算法题?
本文著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请于文首标明作者姓名,保持文章完整性,并附上出处和文章链接!未按规范转载者,作者保留追究相应责任的权利!
作者:北京程序猿
链接:https://yaml.vip/2019/03/05/Leetcode%E4%B9%8B167-%E4%B8%A4%E6%95%B0%E4%B9%8B%E5%92%8CII/