本文主要是介绍167. 两数之和 II - 输入有序数组(Java),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
- 题目描述:
- 输入:
- 输出:
- 代码实现:
- 1.二分(折半)查找
- 2.双指针向内缩进
题目描述:
给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。
以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
你所设计的解决方案必须只使用常量级的额外空间。
输入:
numbers = [2,7,11,15], target = 9
输出:
[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
代码实现:
1.二分(折半)查找
class Solution {public int[] twoSum(int[] numbers, int target) {int[] index = new int[2];// 定义结果数组for (int i = 0; i < numbers.length; i++) {// 从头开始依次假定第一个元素int left = i + 1;// 查找假定元素左边区间的第一个元素int right = numbers.length - 1;// 左边区间的最后一个元素while (left <= right) {// 在区间内查找另外一个满足要求的元素int mid = (right - left) / 2 + left;// 取区间中的中间元素if (numbers[mid] == target - numbers[i]) {// 如果满足查找元素=目标值-假定元素,则记录结果,跳出循环index[0] = i + 1;index[1] = mid + 1;break;} else if (numbers[mid] > target - numbers[i]) {// 查找元素比目标大,右边界收缩right = mid - 1;} else {// 查找元素比目标小,左边界收缩left = mid + 1;}}}return index;// 返回结果}
}
2.双指针向内缩进
class Solution {public int[] twoSum(int[] numbers, int target) {int low = 0;// 定义左指针int high = numbers.length - 1;// 定义右指针while (low < high) {// 左指针要大于右指针if (numbers[low] + numbers[high] == target) {// 如果求和满足目标值,直接返回其索引数组return new int[] { low + 1, high + 1 };} else if (numbers[low] + numbers[high] > target) {// 如果如果大于了目标值,右指针回退high--;} else {// 如果小于目标值,左指针进一low++;}}return new int[] { -1, -1 };// 没有命中目标值的情况}
}
这篇关于167. 两数之和 II - 输入有序数组(Java)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!