167.两数之和Ⅱ-输入有序数组
双指针+了一点小小小的优化:
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.两数之和Ⅱ-输入有序数组相关推荐
- Leetcode每日一题:167.two-sum-ii-input-array-is-sorted(两数之和Ⅱ-输入有序数组)
解题思路:双指针 l 和 r,分别指向头和尾,对于这个有序数组,如果number[l] + number[r] 比 target大,那么说明选择的r对应元素偏大,将指针 r 左移:如果小于target ...
- ❤️导图整理数组3: 两数之和II有序数组, 多个有序, 思路全变, 力扣167❤️
此专栏文章是对力扣上算法题目各种方法的总结和归纳, 整理出最重要的思路和知识重点并以思维导图形式呈现, 当然也会加上我对导图的详解. 目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解), ...
- 47 - 算法 - Leetcode -167-两数之和 - 输入有序数组
// o(n) 的复杂度 #include<vector> using namespace std; class Solution {public:vector<int> tw ...
- 领扣-1/167 两数之和 Two Sum MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- c++两个数组对比去掉重复的元素_LeetCode 题解 | 167.两数之和 II 输入有序数组...
点击上方蓝字设为星标 下面开始今天的学习- 力扣 167.两数之和 II - 输入有序数组(点击文末阅读原文查看题目)题目描述 给定一个已按照 升序排列 的有序数组,找到两个数使得它们相加之和等于目标 ...
- 力扣 167. 两数之和 II - 输入有序数组
167. 两数之和 II - 输入有序数组 给定一个已按照 非递减顺序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target . 函数应该以长度为 2 的整数数 ...
- C/C++描述 LeetCode 167. 两数之和 II - 输入有序数组
C/C++描述 LeetCode 167. 两数之和 II - 输入有序数组 大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在 ...
- 167. 两数之和 II - 输入有序数组
167. 两数之和 II - 输入有序数组 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必 ...
- 双指针算法(三):力扣【167.两数之和 | 经典例题
本文将讲述双指针算法的一个经典例题,167.两数之和 [题目描述] 给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target . 函数应该以长 ...
最新文章
- Python 爬虫框架Scrapy安装汇总
- spring的xml配置文件出现故障
- 静态成员函数调用方式--收藏帖子
- C语言探秘:C代码在内存中的分布
- MINST数据集下载失败
- Operations Manager 2007 R2系列之仪表板(多)视图
- 万字长文:解读区块链7类共识算法
- 【机器学习】梯度下降中矩阵的迹的求导证明
- python将图片原比例缩小_Python实现图片长宽比例缩放和填充
- 2020年接近尾声,我选择来鲲鹏开发者技术峰会学点干货!
- 浏览器管理oracle网址,浏览器用户界面 (Browser User Interface, BUI)
- 自然语言处理中的预训练模型-邱锡鹏老师
- pfc颗粒linux安装包,离散元颗粒流软件(PFC3D/PFC2D)
- 数据分析师职业发展的几个层次,具体是什么做什么的
- 以太网没有有效IP配置问题
- 域服务器无法修改域账户密码,域用户使用Ctrl+Alt+del不能修改密码
- 联阿里接腾讯,B站如何实现“意义非凡”的一年
- 重启网卡提示Bringing up interface eth0
- C#程序无法连接本地数据库
- matlab:变计算精度函数vpa,digits
热门文章
- 强化学习与3D视觉结合新突破:高效能在线码垛机器人
- 青春就是一无所有,梦想就是坚持走下去
- Docker overlay网络互通
- 微信小程序长按事件触发点击事件的BUG处理
- 微信小程序把玩(四)应用生命周期
- 如何取得sql语句的运行时间
- Makefile理解
- java fx alert_javaFx:使用弹出对话框 Alert
- word录入表单数据 java 导入系统,java导入excel | 怎么把excel中的数据批量导入到word中的表格中...
- 禅道设置bug模板_JPress v3.0 beta.2 发布,修复 bug 和完善产品细节