LeetCode算法题-Two Sum II - Input array is sorted
这是悦乐书的第179次更新,第181篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第38题(顺位题号是167)。给定已按升序排序的整数数组,找到两个数字,使它们相加到特定的目标数。函数twoSum应该返回两个数字的索引,使它们加起来到目标,其中index1必须小于index2。
注意:
返回的答案(index1和index2)不是从零开始的。
可以假设每个输入只有一个解决方案,并且您可能不会两次使用相同的元素。
例如:
输入:数字= [2,7,11,15],目标= 9
输出:[1,2]
说明:2和7之和为9.因此index1 = 1,index2 = 2。
本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。
02 第一种解法
此题和LeetCode算法题的第一题Two Sum类似,不过此题定义和条件更加清晰,规定了只存在唯一解,并且将数组进行了排序。
和以前一样,第一种解法是暴力解法,使用双层循环,依次遍历相加判断和是否等于目标值,直到找到两元素为止。但是元素的索引需要加1,因为题目要求索引不从0开始。
特殊情况:当数组为空或者其长度小于2时,直接返回空。
public int[] twoSum (int[] numbers, int target) {
if (numbers == null || numbers.length < 2) {
return null;
}
int[] index = new int[2];
for(int i = 0; i < numbers.length; i++) {
for(int j = i+1; j < numbers.length; j++) {
if (numbers[i] + numbers[j] == target) {
index[0] = i+1;
index[1] = j+1;
}
}
}
return index[0] == 0 ? null : index;
}
此解法时间复杂度是O(n^2),空间复杂度是O(1)。
03 第二种解法
使用HashMap,遍历数组时,判断当前元素和目标值之间的差值是否存在map中,如果存在,就返回map中此元素的value,即其索引,和当前元素的索引;否则,将当前元素作为key,索引作为value存入map中,然后进行下一次循环。
特殊情况:当数组为空或者其长度小于2时,直接返回空。
public int[] twoSum2 (int[] numbers, int target) {
if (numbers == null || numbers.length < 2) {
return null;
}
int[] index = new int[2];
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for (int k=0; k<numbers.length; k++) {
if (map.containsKey(target-numbers[k])) {
index[0] = map.get(target-numbers[k]);
index[1] = k+1;
}
map.put(numbers[k], k+1);
}
return index[0] == 0 ? null : index;
}
时间复杂度是O(n),空间复杂度是O(n)。
04 第三种解法
既然数组已经是排过序的,使用双指针,每次从前往后和从后往前各取一个元素,判断两数之和是否等于目标值,如果小于目标值,则从前往后的指针向前移动一位;如果大于目标值,则从后往前的指针向前移动一位,直到两数之和等于目标值即可。
特殊情况:当数组为空或者其长度小于2时,直接返回空。
public int[] twoSum3(int[] numbers, int target) {
if (numbers == null || numbers.length < 2) {
return null;
}
int start = 0;
int end = numbers.length - 1;
while (start < end) {
int sum = numbers[start] + numbers[end];
if (sum == target) {
return new int[] {start+1, end+1};
} else if (sum < target) {
start++;
} else {
end--;
}
}
return null;
}
此解法的时间复杂度是O(n),空间复杂度是O(1)。
05 小结
算法专题目前已连续日更超过一个月,算法题文章38+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode算法题-Two Sum II - Input array is sorted的更多相关文章
- leetcode算法:Two Sum II - Input array is sorted
Given an array of integers that is already sorted in ascending order, find two numbers such that the ...
- Leetcode No.167 Two Sum II - Input array is sorted(c++实现)
1. 题目 1.1 英文题目 Given an array of integers numbers that is already sorted in non-decreasing order, fi ...
- 【LeetCode】167. Two Sum II - Input array is sorted
Difficulty:easy More:[目录]LeetCode Java实现 Description Given an array of integers that is already sor ...
- 【LeetCode】167. Two Sum II - Input array is sorted 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 Python解法 日期 题目地址:ht ...
- 【Leetcode 167】Two Sum II - Input array is sorted
问题描述:给出一个升序排列好的整数数组,找出2个数,它们的和等于目标数.返回这两个数的下标(从1开始),其中第1个下标比第2个下标小. Input: numbers={2, 7, 11, 15}, t ...
- 【LEETCODE】38、167题,Two Sum II - Input array is sorted
package y2019.Algorithm.array; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.array * ...
- Leetcode之二分法专题-167. 两数之和 II - 输入有序数组(Two Sum II - Input array is sorted)
Leetcode之二分法专题-167. 两数之和 II - 输入有序数组(Two Sum II - Input array is sorted) 给定一个已按照升序排列 的有序数组,找到两个数使得它们 ...
- 167. Two Sum II - Input array is sorted - LeetCode
Question 167. Two Sum II - Input array is sorted Solution 题目大意:和Two Sum一样,这里给出的数组是有序的 思路:target - nu ...
- 29. leetcode 167. Two Sum II - Input array is sorted
167. Two Sum II - Input array is sorted Given an array of integers that is already sorted in ascendi ...
随机推荐
- 跨域学习笔记1--跨域调用webapi
在做Web开发中,常常会遇到跨域的问题,到目前为止,已经有非常多的跨域解决方案. 通过自己的研究以及在网上看了一些大神的博客,写了一个Demo 首先新建一个webapi的程序,如下图所示: 由于微软已 ...
- js绑定下拉框
---恢复内容开始--- 方法一 js-ajax部分 function GetDListOfCt() { $.ajax({ url: "../../Ajax/Boss_Show.ashx?t ...
- 【转载】阿里云服务器为网站选配Https证书
数字证书是一个经权威授权机构数字签名.包含公开密钥拥有者信息以及公开密钥的文件,是权威机构颁发给网站的可信凭证.最简单的证书包含一个公开密钥.证书名称以及证书授权中心的数字签名,只在特定的时间内有效. ...
- nginx配置虚拟机
在/usr/local/nginx/conf目录下nginx.conf文件是nginx的配置文件. 一.通过端口号区分虚拟机 在nginx.conf文件中添加一个Service节点,修改端口号: se ...
- Java学习笔记之——final关键字
最终的,最后的 可以修饰:变量.方法.类 (1) 修饰变量 不可改变,即常量,只能赋值一次,赋值之后不可改变 a. 修饰属性:private final int num; 要求属性要显式赋值 通常在属 ...
- 理解Promise的3种姿势
译者按: 对于Promise,也许你会用了,却并不理解:也许你理解了,却只可意会不可言传.这篇博客将从3个简单的视角理解Promise,应该对你有所帮助. 原文: Three ways of unde ...
- crontab命令行和日志查看
1.基本命令行模式 注意:非root用户 systemctl restart crond 失效,请使用最底层的驱动重启 2.crontab日志 cron日志保存在系统目录/var/log/cron 命 ...
- css不受高度限制实现文本超出隐藏并以省略号结束
文本超出省略号显示代码: overflow: hidden; text-overflow:ellipsis; white-space: nowrap;width: 100px; /*宽度做好限制*/ ...
- AI在汽车中的应用:实用深度学习
https://mp.weixin.qq.com/s/NIza8E5clC18eMF_4GMwDw 深度学习的“深度”层面源于输入层和输出层之间实现的隐含层数目,隐含层利用数学方法处理(筛选/卷积)各 ...
- SAP MM 按采购订单查询付款信息的报表?
SAP MM 按采购订单查询付款信息的报表? 上午给P3项目采购部门用户做了一个采购相关的报表的培训.培训过程中,客户的采购部门经理提出了一个问题:有没有报表能查询到各个采购订单的付款情况,显示采购订 ...