两数之和 II - 输入有序数组
- leetcode 167 原题链接
- 解题思路
- 解题代码
- 排序专题
leetcode 167 原题链接
167. 两数之和 II - 输入有序数组 – 原题链接
题目描述:
给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。
以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
你所设计的解决方案必须只使用常量级的额外空间。
示例 1:
输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
示例 2:
输入:numbers = [2,3,4], target = 6
输出:[1,3]
解释:2 与 4 之和等于目标数 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3] 。
示例 3:
输入:numbers = [-1,0], target = -1
输出:[1,2]
解释:-1 与 0 之和等于目标数 -1 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
提示:
2 <= numbers.length <= 3 * 104
-1000 <= numbers[i] <= 1000
numbers 按 非递减顺序 排列
-1000 <= target <= 1000
仅存在一个有效答案
解题思路
这个题我们可以用双指针法.因为数组是有序的,我们一个指针卡住左边,一个指针卡住右边,相加的和去跟目标值去比较,如果相等可以直接返回了,如果小于目标值,左边指针右移让相加和变大,比目标值大呢,右边指针左移,让相加值变小,这样一次循环就可以解决问题了.
解题代码
public int[] twoSum(int[] numbers, int target) {//左右指针法int left = 0;int right = numbers.length - 1;while(left < right){int num = numbers[left] + numbers[right];if(num == target){//题目交代下标从1开始,所以下标加上1return new int[]{left + 1, right + 1};} else if(num < target){left++;}else if(num > target){right--;}}return null;}
排序专题
递归排序实现和普通方式实现(java)
归并排序解决逆序对问题(java实现,递归方式)
随机快排专题 两种方式的随机快排(使用Java实现)
随机快排的非递归实现方式(java)
堆排序专题-把一个数组变成大根堆的两种方式和根据大根堆来实现对数组的排序