力扣167(java&python)-两数之和 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
- 仅存在一个有效答案
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/two-sum-ii-input-array-is-sorted
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
双指针:感觉这题思路和力扣633:https://www.cnblogs.com/liu-myu/p/16731633.html这个双指针思路差不多~
定义两个指针初始时 i=0,j = numbers.length - 1,计算当前下标 i 和 j 对应的数字和 sum =numbers[i] + numbers[j], 题目中要求 i 和 j 满足:0<= i < j < n,因此循环条件为:i < j:
- 当sum < target 时,i++;
- 当sum > target 时,j--;
- 当sum = target 时,返回当前的下标 i 和 j;
- 如果最后没找到,则返回[0, 0]。
举例:n = 6
1. i 和 j 满足:0<= i < j < n,故可查找范围为蓝色部分,第一次sum = N[0] + N[5]
2.假设sum = N[0] + N[5] > target,那么 N[1] + N5], N[2] + N[5], N[3] + N[5],..., N[5] + N[5]都大于target,相当于j = 5这一列都被排除了,对应指针变化:j --;
3.上一步变化后就为sum = N[0] + N[4] ,假设这时sum < target,那么N[0] + N[0], N[0] + N[1], N[0] + N[2], N[0] + N[3]都小于target,相当于i = 0这一行都被排除了,对应指针变化:i++;
4.对以上两种情况进行循环判断,直到最后要么排除掉所有的格子,返回[0, 0],要么找到sum = target的格子,进行返回对应的[i+1, j+1]。
java代码:
1 class Solution { 2 public int[] twoSum(int[] numbers, int target) { 3 int i = 0; 4 int j = numbers.length - 1; 5 while(i < j){ 6 int sum = numbers[i] + numbers[j]; 7 if(sum < target){ 8 i++; 9 }else if(sum > target){ 10 j--; 11 }else{ 12 return new int[]{i+1, j+1}; 13 } 14 } 15 return new int[]{0, 0}; 16 } 17 }
python3代码:
1 class Solution: 2 def twoSum(self, numbers: List[int], target: int) -> List[int]: 3 i, j = 0, len(numbers)-1 4 while i < j: 5 sum = numbers[i] + numbers[j] 6 if sum < target: 7 i += 1 8 elif sum > target: 9 j -= 1 10 else: 11 return [i+1, j+1] 12 return [0,0]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)