LeetCode_两数之和

这篇博客讨论了如何利用哈希表有效地解决寻找数组中两个数之和等于目标值的问题。文章对比了暴力解法、二分查找法和哈希表方法,指出哈希表在效率上的优势。对于哈希表方法,原始实现可能无法处理重复元素导致的多解情况,因此提出了改进方案,通过将哈希表的值存储为列表来保存所有可能的索引,确保找到所有符合条件的答案。这种方法在处理包含重复元素的数组时能提供完整的结果。
摘要由CSDN通过智能技术生成

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

方法1:暴力解法

class Solution:
    def twoSum(self, nums, target):
        n = len(nums)
        for i in range(n-1):
            for j in range(i + 1, n):
                if nums[i] + nums[j] == target:
                    return [i, j]
        return []

方法2:二分查找

class Solution(object):
    def binary_search(self, lis, left, right, val):
        while left <= right:
            mid = (left + right) // 2
            if lis[mid][0] == val:
                return mid
            elif lis[mid][0] > val:
                right = mid - 1
            else:
                left = mid + 1
        return None

    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """        
        new_nums = [[num, i] for i, num in enumerate(nums)]
        new_nums.sort(key=lambda x:x[0])
        for i in range(len(nums)):
            a = new_nums[i][0]
            b = target - a
            if b >= a:
                j = self.binary_search(new_nums, i+1, len(nums)-1, b)
            else:
                j = self.binary_search(new_nums, 0, i-1, b)
            if j:
                break
        return sorted([new_nums[i][1], new_nums[j][1]])

方法3:哈希表

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """        
        d = {}
        for idx1, val1 in enumerate(nums):
            val2 = target - val1
            if val2 in d:
                return idx1, d[val2]
            d[val1] = idx1

考虑到实际情况可能不只是一种答案的组成,代码的鲁棒性是存在一些问题的,例如[2,3,1,5,2,3,1,9],target=11,你会发现,哈希表给出的结果为[4,7],显而易见,字典将后面的索引给抵消掉了,我们默认是想要知道前面的索引,即结果为[0,7]

代码修改如下:

def twoSum(nums, target):
    hashtable = {}
    for i, num in enumerate(nums):
        if target-num in hashtable:
            return [hashtable[target-num], i] #考虑到可能会有多个重复数字,如果重复了就产生了一个索引错误的问题

        if num in hashtable:
            hashtable[num].append(i)
        else:
            hashtable[num] = [i]
    return []

根据键值对,修改值为列表形式,可存储更多的结果,能够返回所有的结果情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting_1997

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值