当前位置:网站首页>[leetcode] The sword refers to Offer II 006. The sum of two numbers in a sorted array (binary search, double pointer)
[leetcode] The sword refers to Offer II 006. The sum of two numbers in a sorted array (binary search, double pointer)
2022-07-29 23:16:00 【friedrichor】
剑指 Offer II 006. 排序数组中两个数字之和
问题描述
给定一个已按照 升序排列 的整数数组 numbers
,请你从数组中找出两个数满足相加之和等于目标数 target
.
函数应该以长度为 2 的整数数组的形式返回这两个数的下标值.numbers 的下标 从 0 开始计数 ,所以答案数组应当满足 0 < = a n s w e r [ 0 ] < a n s w e r [ 1 ] < n u m b e r s . l e n g t h 0 <= answer[0] < answer[1] < numbers.length 0<=answer[0]<answer[1]<numbers.length .
假设数组中存在且只存在一对符合条件的数字,同时一个数字不能使用两次.
示例 1:
输入:numbers = [1,2,4,6,10], target = 8
输出:[1,3]
解释:2 与 6 之和等于目标数 8 .因此 index1 = 1, index2 = 3 .
示例 2:
输入:numbers = [2,3,4], target = 6
输出:[0,2]
示例 3:
输入:numbers = [-1,0], target = -1
输出:[0,1]
提示:
- 2 <= numbers.length <= 3 * 1 0 4 10^4 104
- -1000 <= numbers[i] <= 1000
- numbers 按 递增顺序 排列
- -1000 <= target <= 1000
- 仅存在一个有效答案
思路&代码
方法一:穷举
略
方法二:二分法
Binary search related explanation:【二分查找】详细图解
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
length = len(numbers)
for i in range(length - 1):
low = i + 1
high = length - 1
while low <= high:
mid = (low + high) // 2
if numbers[mid] == target - numbers[i]:
return [i, mid]
elif numbers[mid] > target - numbers[i]:
high = mid - 1
else:
low = mid + 1
时间复杂度: O ( n log n ) O(n \log n) O(nlogn),其中 n 是数组的长度.需要遍历数组一次确定第一个数,时间复杂度是 O ( n ) O(n) O(n),寻找第二个数使用二分查找,时间复杂度是 O ( log n ) O(\log n) O(logn),因此总时间复杂度是 O ( n log n ) O(n \log n) O(nlogn).
空间复杂度: O ( 1 ) O(1) O(1).
方法三:双指针
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
low = 0
high = len(numbers) - 1
while low < high:
sum = numbers[low] + numbers[high]
if sum == target:
return [low, high]
elif sum > target:
high -= 1
else:
low += 1
时间复杂度: O ( n ) O(n) O(n),其中 n n n 是数组的长度.两个指针移动的总次数最多为 n n n 次.
空间复杂度: O ( 1 ) O(1) O(1).
边栏推荐
- WSDM‘22推荐系统论文梳理
- high-level-rest-client 判断索引是否存在
- C语言快速入门(为了看源码)
- WeChat applet sliding navigation bar (how to set the floating window of the webpage)
- 2022年最新甘肃建筑八大员(材料员)模拟考试试题及答案
- J9数字论:为什么我们需要Web3?
- 汉字的URL转义字符函数
- 【C语言】链表详解(无头单向非循环)
- 云计算1+X之openstack篇
- Embedded system driver primary [1] - kernel module _ compilation method
猜你喜欢
随机推荐
【C语言入门】ZZULIOJ 1036-1040
Foxmail是什么邮箱?
暴力递归到动态规划 03 (背包问题)
访问公司内网
微信小程序滑动导航栏(网页浮动窗口怎么设置)
go语言中的goroutine(协程)
MySQL数据库进阶篇
Topics in Dynamic Programming
SAP ABAP 守护进程的实现方式
Spark读取多目录
玻璃表面修饰DNA|DNA修饰的上转换纳米材料|DNA-UCNPs实验原理
Jsp使用&lt;c:forEach&gt;遍历List集合「建议收藏」
DNA偶联二维过渡金属硫化物|DNA修饰贵金属纳米颗粒|使用方法
The Sandbox 与 Gravity 达成合作,将《RO仙境传说》带入元宇宙
一个print函数,挺会玩啊?
[leetcode] 82. Delete duplicate elements in sorted linked list II (medium)
Another new rule for credit cards is coming!Juphoon uses technology to boost the financial industry to improve service quality and efficiency
JZ23 链表中环的入口结点
流水线上的农民:我在工厂种蔬菜
@Accessors 注解详解