Q167 Two Sum II - Input array is sorted
Given an array of integers that is already sorted in ascending order, find two numbers such that they add up to a specific target number.
The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.
You may assume that each input would have exactly one solution and you may not use the same element twice.
Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2
解题思路:
参考题目: Q1 Two Sum
这道题与 Q1 Two Sum 不同的是给定的列表是排好序的。如果按照 Q1 Two Sum 的思路,时间复杂度和空间复杂度均为 O(n)。
既然是排序好的列表,那么就应该利用这样一个优势。
方法一:时间复杂度为 O(nlgn),空间复杂度为 O(1) 。具体做法就是依次遍历列表中的元素,得到目标值与元素的差值,然后在剩余的元素中采用二分查找。
方法二:时间复杂度为 O(n),空间复杂度为 O(1) 。利用两个指针,一个指向列表头,一个指向列表尾。将头尾两元素值相加与目标值相比,如果比目标值小,则头指针向前移动;否则,尾指针向后移动。不断缩小范围,直到找到相加值与目标值相等的两个元素,否则返回None。
程序实现最终采用了方法二。
注意点:
返回的索引不是从0开始的,而是从1开始的。
Python实现:
class Solution(object):
def twoSum(self, numbers, target):
"""
:type numbers: List[int]
:type target: int
:rtype: List[int]
"""
lens = len(numbers)
if lens == 0:
return None
l, h = 0, lens - 1 # 头尾两个指针
while l < h:
tar = numbers[l] + numbers[h]
if tar == target:
return [l+1, h+1]
elif tar < target:
l += 1
else:
h -= 1
return None
a = [2,3,5,7]
b = 10
c = Solution()
print(c.twoSum(a,b)) # [2,4]
总结:
方法二为两指针法,是一种常用的方法。它适用于排好序的列表。
- 用Python将word文件转换成html
- 1行Python代码实现FTP服务器
- 100行Python代码实现自动抢火车票
- Python交互式数据分析报告框架:Dash
- PyQt5 GUI应用程序工具包入门(2)
- 用Python研究了三千套房子,告诉你究竟是什么抬高了房价?
- 设计模式之装饰模式
- Android网络编程(六)OkHttp3用法全解析
- Android网络编程(五)OkHttp用法全解析
- Android网络编程(一)HTTP协议原理
- Spring Cloud实战小贴士:Zuul统一异常处理(二)
- Android View体系(九)自定义View
- Android网络编程(二)HttpClient与HttpURLConnection
- Spring Batch入门篇
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法