当前位置:网站首页>[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).
边栏推荐
猜你喜欢

Topics in Dynamic Programming

The Sandbox Partners with Gravity to Bring RO Ragnarok to the Metaverse

DNA脱氧核糖核酸修饰四氧化三铁|DNA修饰氧化锌|使用方法

J9数字论:为什么我们需要Web3?

MySQL数据库进阶篇

Another new rule for credit cards is coming!Juphoon uses technology to boost the financial industry to improve service quality and efficiency

【LeetCode-SQL每日一练】——2. 第二高的薪水

BGP Federal Comprehensive Experiment

jenkins使用维护

Three chess (written in C language)
随机推荐
通过 FileUploader 的初始化,了解 SAP UI5 应用的 StaticArea 初始化逻辑
labview怎么做成应用程序(labview程序识别形状)
浅析即时通讯移动端开发DNS域名劫持等杂症
新型LaaS协议Elephant Swap给ePLATO提供可持续溢价空间
JZ23 链表中环的入口结点
Another new rule for credit cards is coming!Juphoon uses technology to boost the financial industry to improve service quality and efficiency
暴力递归到动态规划 03 (背包问题)
cv.copyMakeBorder(imwrite opencv)
【MySQL系列】 MySQL表的增删改查(进阶)
J9数字论:为什么我们需要Web3?
Foxmail是什么邮箱?
JZ22 链表中倒数最后k个结点
canvas 中如何实现物体的点选(五)
我们上线了一个「开发者实验室」
MySQL主备切换
J9 Number Theory: Why do we need Web3?
[leetcode] 82. Delete duplicate elements in sorted linked list II (medium)
【leetcode】75. 颜色分类(中等)(双指针、原地修改)
你真的了解Redis的持久化机制吗?
C语言实现扫雷(9*9)游戏——详解