双指针+了一点小小小的优化:

class Solution {public int[] twoSum(int[] numbers, int target) {int left=0;int right=numbers.length-1;while(left<=right){int mediate=left+(right-left)/2;if(numbers[left]+numbers[right]==target) return new int[] {left+1,right+1};else if(numbers[left]+numbers[right]<target){if(numbers[mediate]+numbers[right]<target) left=mediate+1;else if(numbers[mediate]+numbers[right]>target) left=left+1;else return new int[] {mediate+1,right+1};}else if(numbers[left]+numbers[right]>target){if(numbers[mediate]+numbers[left]>target) right=mediate-1;else if(numbers[mediate]+numbers[left]<target)  right=right-1;else return new int[] {left+1,mediate+1};}}return null;}}

看见了一个很妙的写法,可以用二分法确定右边的范围,然后用双指针来确定最终结果。


class Solution {public int[] twoSum(int[] numbers, int target) {if(numbers==null) return null;int tail=Dichotomy(numbers,target-numbers[0]);int head=0;while(head<tail){int sum=numbers[head]+numbers[tail];if(sum==target) return new int[]{head+1,tail+1};else if(sum<target) head++;else tail--;  }return null;}private int Dichotomy(int[] numbers,int target){//找到了最接近目标值的下标int left=0;int right=numbers.length-1;while(left<=right){int mediate=left+(right-left)/2;if(numbers[mediate]==target) return mediate;else if(numbers[mediate]>target) right=mediate-1;else left=mediate+1;}return left-1;//即返回的num[left-1]<target}
}

如果nums[i]>target-nums[0]的话,则nums[i]以及右边肯定不是所求。
我们需要nums[i]<=target-nums[0] 。而Dichotomy解决的就是这个问题。

也了解了,由于+的优先级高于>>,所以8+(10)>>1结果是9,而不是13.

167.两数之和Ⅱ-输入有序数组相关推荐

  1. Leetcode每日一题:167.two-sum-ii-input-array-is-sorted(两数之和Ⅱ-输入有序数组)

    解题思路:双指针 l 和 r,分别指向头和尾,对于这个有序数组,如果number[l] + number[r] 比 target大,那么说明选择的r对应元素偏大,将指针 r 左移:如果小于target ...

  2. ❤️导图整理数组3: 两数之和II有序数组, 多个有序, 思路全变, 力扣167❤️

    此专栏文章是对力扣上算法题目各种方法的总结和归纳, 整理出最重要的思路和知识重点并以思维导图形式呈现, 当然也会加上我对导图的详解. 目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解), ...

  3. 47 - 算法 - Leetcode -167-两数之和 - 输入有序数组

    // o(n) 的复杂度 #include<vector> using namespace std; class Solution {public:vector<int> tw ...

  4. 领扣-1/167 两数之和 Two Sum MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  5. c++两个数组对比去掉重复的元素_LeetCode 题解 | 167.两数之和 II 输入有序数组...

    点击上方蓝字设为星标 下面开始今天的学习- 力扣 167.两数之和 II - 输入有序数组(点击文末阅读原文查看题目)题目描述 给定一个已按照 升序排列 的有序数组,找到两个数使得它们相加之和等于目标 ...

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

    167. 两数之和 II - 输入有序数组 给定一个已按照 非递减顺序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target . 函数应该以长度为 2 的整数数 ...

  7. C/C++描述 LeetCode 167. 两数之和 II - 输入有序数组

    C/C++描述 LeetCode 167. 两数之和 II - 输入有序数组   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在 ...

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

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

  9. 双指针算法(三):力扣【167.两数之和 | 经典例题

    本文将讲述双指针算法的一个经典例题,167.两数之和 [题目描述] 给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target . 函数应该以长 ...

最新文章

  1. Python 爬虫框架Scrapy安装汇总
  2. spring的xml配置文件出现故障
  3. 静态成员函数调用方式--收藏帖子
  4. C语言探秘:C代码在内存中的分布
  5. MINST数据集下载失败
  6. Operations Manager 2007 R2系列之仪表板(多)视图
  7. 万字长文:解读区块链7类共识算法
  8. 【机器学习】梯度下降中矩阵的迹的求导证明
  9. python将图片原比例缩小_Python实现图片长宽比例缩放和填充
  10. 2020年接近尾声,我选择来鲲鹏开发者技术峰会学点干货!
  11. 浏览器管理oracle网址,浏览器用户界面 (Browser User Interface, BUI)
  12. 自然语言处理中的预训练模型-邱锡鹏老师
  13. pfc颗粒linux安装包,离散元颗粒流软件(PFC3D/PFC2D)
  14. 数据分析师职业发展的几个层次,具体是什么做什么的
  15. 以太网没有有效IP配置问题
  16. 域服务器无法修改域账户密码,域用户使用Ctrl+Alt+del不能修改密码
  17. 联阿里接腾讯,B站如何实现“意义非凡”的一年
  18. 重启网卡提示Bringing up interface eth0
  19. C#程序无法连接本地数据库
  20. matlab:变计算精度函数vpa,digits

热门文章

  1. 强化学习与3D视觉结合新突破:高效能在线码垛机器人
  2. 青春就是一无所有,梦想就是坚持走下去
  3. Docker overlay网络互通
  4. 微信小程序长按事件触发点击事件的BUG处理
  5. 微信小程序把玩(四)应用生命周期
  6. 如何取得sql语句的运行时间
  7. Makefile理解
  8. java fx alert_javaFx:使用弹出对话框 Alert
  9. word录入表单数据 java 导入系统,java导入excel | 怎么把excel中的数据批量导入到word中的表格中...
  10. 禅道设置bug模板_JPress v3.0 beta.2 发布,修复 bug 和完善产品细节