题目:

给你一个下标从 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]

力扣167(java&python)-两数之和 II - 输入有序数组(中等)的更多相关文章

  1. 领扣(LeetCode)两数之和II - 输入有序数组 个人题解

    给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的下标值 ...

  2. Java实现 LeetCode 167 两数之和 II - 输入有序数组

    167. 两数之和 II - 输入有序数组 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必 ...

  3. Leetcode之二分法专题-167. 两数之和 II - 输入有序数组(Two Sum II - Input array is sorted)

    Leetcode之二分法专题-167. 两数之和 II - 输入有序数组(Two Sum II - Input array is sorted) 给定一个已按照升序排列 的有序数组,找到两个数使得它们 ...

  4. 167. 两数之和 II - 输入有序数组 + 哈希表 + 双指针

    167. 两数之和 II - 输入有序数组 LeetCode_167 题目描述 方法一:暴力法(使用哈希表) class Solution { public int[] twoSum(int[] nu ...

  5. LeetCode167 两数之和 II - 输入有序数组

    给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的下标值 ...

  6. Leetcode 167. 两数之和 II - 输入有序数组 By Python

    给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的下标值 ...

  7. LeetCode 167:两数之和 II - 输入有序数组 Two Sum II - Input array is sorted

    公众号: 爱写bug(ID:icodebugs) 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index ...

  8. LeetCode 167. 两数之和 II - 输入有序数组

    题目: 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的 ...

  9. 力扣---167. 两数之和 II - 输入有序数组

    给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列  ,请你从数组中找出满足相加之和等于目标数 target 的两个数.如果设这两个数分别是 numbers[index1 ...

  10. 167 Two Sum II - Input array is sorted 两数之和 II - 输入有序数组

    给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数.函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2.请注意,返回的下标值(i ...

随机推荐

  1. ubuntu切换root到user

    目前知道: 从root用户切回user用户有三种方法: 1.su user (user是你自己安装时候的用户名) 2.直接输入exit 3.ctrl+D组合键

  2. OpenLayers绘制热力图 代码记录

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 做地图开发,往往需要掌握专题地图制作的技能.今天用OpenLayers6来做一个热力图的效果. 页面效果: 代码部分: <!DOCT ...

  3. JavaScript知识总结 原型篇

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1. 对原型.原型链的理解 在JavaScript中是使用构造函数来新建一个对象的,每一个构造函数的内部都有一个 prototype 属性 ...

  4. 【Oracle】通过LogMiner实现Oracle数据同步迁移

    写在前面 最近在研究如何实现Oracle数据库之间的数据同步,网上的资料确实比较少.最好用的Oracle数据库同步工具是:GoldenGate ,而GoldenGate是要收费的.那么还有什么好的办法 ...

  5. C# 日志监控软件 基于 FileSystemWatcher 02

    基于上一篇<C# 日志监控软件 基于 FileSystemWatcher>改进 using System; using System.Collections.Generic; using ...

  6. vue中$forceUpdate()的使用

    刷新数组的作用 this.$forceUpdate(); 具体请看:vue中$forceUpdate()的使用 - 简书 (jianshu.com)

  7. CSP:Object as Point同会议论文,相似思想用于人脸和行人检测 | CVPR 2019

    CSP将目标定义为中心点和尺寸,通过网络直接预测目标的中心和寸尺,相对于传统的RCNN类型检测算法轻量化了不少.整体思想与Object as Points撞车了,真是英雄所见略同   来源:晓飞的算法 ...

  8. Java字符串比较 == 和 equals方法的区别

    今天在排除一个bug的时候出现了一个很低级但是也很容易被忽视的错误,在此写了一个小例子做记录. 首先我先说一下错误的场景,我读取了一段json数据,并使用JSONObject的实例对象的getStri ...

  9. 【已解决】(MySQL)SQL注入绕过登陆验证直接登陆---用户名输入框注释sql密码语句段

    今天学习了一种sql注入方法,通过注释密码验证部分的sql语句. 这是登陆界面 在用户名如果输入 15284206891' and 1=1 # 密码可以随意输入即可登陆成功 原理如下: 在sql可视化 ...

  10. #KM算法#UVA1411 Ants

    题目 在一个平面直角坐标系中,有 \(n\) 个黑点,\(n\) 个白点. 给出一种二分图匹配的方案,使得没有两条由黑白点连接的线段相交 分析 如果线段都不相交,根据三角形的两边之和大于第三边,那么线 ...