LeetCode python-167.两数之和II

LeetCode python-167.两数之和II

先看题目:
(题目来力扣网站)
LeetCode python-167.两数之和II_第1张图片
拿到题目,我们回想一下,它与第一道题有什么区别?
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]

Python中bisect模块用法,及实现方式
在这里插入图片描述

你可能感兴趣的:(python,LeetCode,python,167.两数之和II)