机试打卡 -09 两数之和(哈希表)

 


根据“三数之和”的思想,我采用了 排序+双指针 的算法👇

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        
        # 先将nums从小到大排序
        sorted_nums=sorted(nums)

        nums_len=len(nums)

        # nums[i]+nums[j]=target

        # 双指针
        left_pointer=0
        right_pointer=nums_len-1

        while left_pointer<right_pointer:

            left=sorted_nums[left_pointer]
            right=sorted_nums[right_pointer]

            if left+right<target:
                left_pointer+=1
            
            elif left+right>target:
                right_pointer-=1

            else:
                if left!=right:
                    # 注意题目要求返回原数组索引
                    return [nums.index(left),nums.index(right)]
                
                else:
                    # 特殊情况,当left==right时

                    # index方法只能返回第一个索引
                    first_ans=nums.index(left)
                    nums[first_ans]=None
                    second_ans=nums.index(left)
                    return [first_ans,second_ans]

哈希表 为本题更简单的方法,官方代码如下👇

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:

        # {元素:索引}
        hashtable = dict()

        for i, num in enumerate(nums):
            if target - num in hashtable:
                return [hashtable[target - num], i]

            hashtable[nums[i]] = i
        return []

         就已经排好序的数组来说,(针对两数之和问题)双指针算法的时间复杂度和空间复杂度都更低,优于 哈希表 算法。

        就乱序的数组来说,无法使用双指针逼近 target 值,哈希表 算法可以记忆存储先前遍历过的值及其对应的索引,具有较好的时间复杂度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值