LeetCodeWithPython 167. 两数之和 II - 输入有序数组

题目链接

https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted

题目描述

在这里插入图片描述

代码初步

  • 我的思路:利用哈希表将列表的值作为key,索引作为value。判断target - numbers[i]]是否在哈希表中,可知是否有相应的两个值相加等于目标值
  • 问题:hash_table[numbers[i]] = i 必须放在try except 语句后面,如果放在其前面,当目标数为两个值相同的数相加时会出现计算问题。例如:[2,2,3,7], target=4,输出会是【2,2】,正确输出为【1,2】
  • 没有利用上已经是升序排序的数组的条件
  • 复杂度: 时间复杂度:O(n) 时间和 空间复杂度:O(n)
class Solution(object):
    def twoSum(self, numbers, target):
        """
        :type numbers: List[int]
        :type target: int
        :rtype: List[int]
        """
        hash_table = {}
        arr = []
        for i in range(len(numbers)):            
            try:
                hash_table[target - numbers[i]]
            except KeyError:
                pass
            else:
                arr = [hash_table[target - numbers[i]]+1, i+1]
            hash_table[numbers[i]] = i
        return arr

在这里插入图片描述

代码欣赏

  • 方法:双指针法
    使用两个指针,初始分别位于第一个元素和最后一个元素位置,比较这两个元素之和与目标值的大小。如果和等于目标值,我们发现了这个唯一解。如果比目标值小,我们将较小元素指针增加一。如果比目标值大,我们将较大指针减小一。移动指针后重复上述比较知道找到答案。
class Solution(object):
    def twoSum(self, numbers, target):
        """
        :type numbers: List[int]
        :type target: int
        :rtype: List[int]
        """
        left = 0
        right = len(numbers)-1
        while left<right:
            sum = numbers[left]+numbers[right]
            if sum<target:
                left+=1
            elif sum>target:
                right-=1
            else:
                return [left+1,right+1]
        return []

在这里插入图片描述

  • 复杂度分析
    时间复杂度:O(n)。每个元素最多被访问一次,共有 nn 个元素。
    空间复杂度:O(1)。只是用了两个指针。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值