LeetCode python-167.两数之和II
先看题目:
(题目来力扣网站)
拿到题目,我们回想一下,它与第一道题有什么区别?
LeetCode python-1.两数之和
我们会发现区别在于numbers是否排序,排序的好处是从小到大,或者从大到小,代码reverse=False,代表升序,一般不添加reverse,就默认升序。那我们的思路是否可以从两头开始,一起查找。
第一种方法(从两头查找)
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
lens = len(numbers) #numbers长度
i = 0 #i代表从左端开始
j = lens - 1 #j代表从右端楷书
while i < j:
if target == numbers[i] + numbers[j]: #如果索引 i 所对应的值 + 索引 j 所对应的值 = target
return [i + 1, j + 1] #返回各自索引+1,因为题目要求下标值不是从0开始
elif target < numbers[i] + numbers[j]:
j -= 1 #若果和大于目标值,则 j 往左移动,因为该numbers是从小到大排列,最右端的值最大,往左移动,其和会减小
else:
i += 1 #若果和小于目标值,则 i 往右移动,因为该numbers是从小到大排列,最左端的值最小,往右移动,其和会增大
第二种方法(二分法)
class Solution:
def twoSum(self, numbers, target):
lens = len(numbers)
for i in range(lens):
num = target - numbers[i] #另一个数
idx = bisect.bisect_left(numbers, num, i + 1, lens) #在numbers中查找num,若存在则返回num左侧的位置,i+1和lens代表在此区间范围内查找,因为 i 是从小到大开始循环,那么num所对应的的下标在 i 的右侧,故从 i + 1 开始查找即可。
if idx < lens and numbers[idx] == num: # 如果索引 idx 小于numbers的长度,并且 numbers[idx] 的值等于 num,则满足条件
return [i + 1, idx + 1]
来源:CSDN
作者:hxy-1
链接:https://blog.csdn.net/weixin_43675940/article/details/101100574