美文网首页Leetcode刷题
leetcode 1. 两数之和 python实现

leetcode 1. 两数之和 python实现

作者: vvblack4 | 来源:发表于2019-12-08 22:05 被阅读0次

题目:

leetcode1题目描述

解法:

1. 暴力解法

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

这是最最容易想到的方法了......先用i遍历一遍nums中的每一个元素,然后再看nums[i]元素与后面的nums[j]元素之和是否等于target

复杂度分析:

  • 时间复杂度:O(n^2)
  • 空间复杂度:O(1)

效率:

暴力解法效率

2. 哈希表法

暴力解法比较慢是因为我们用了两层循环,为了提高效率,我们可以选择“空间换时间”的方法,来降低第二层循环的时间。所以我们选择使用哈希表来降低查找时间。

2.1 两遍哈希

我们可以先遍历一遍nums,构建哈希表,其中元素的值作为key、元素的索引作为value,从而通过哈希表来确定元素在nums中的索引位置。然后,再次遍历nums,通过刚刚构建的哈希表确定是否有元素等于target - nums[i]
需要注意的是,题目中说每个数只能用一次,所以一定要在if语句中加上条件i!=hashdict[diff]

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        hashdict = {num: index for index, num in enumerate(nums)}
        # print(hashdict)
        for i, num in enumerate(nums):
            diff = target - nums[i]
            if diff in hashdict and i!=hashdict[diff]: ##确保选中的是两个不同索引的数
                return [i,hashdict[diff]]

复杂度分析:

  • 时间复杂度:O(n)
  • 空间复杂度:O(n):哈希表里存放了n个元素

效率:
可以看到,运行时间显著地降低了,从6.3s降低为0.06s。

两遍哈希效率

2.2 一遍哈希

2.1的方法中,哈希表的构建和查找是分开的,我们可以边构建边查找,从而进一步地降低运行时间。

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        hashdict = {}
        for i, num in enumerate(nums):
            diff = target - nums[i]
            if diff in hashdict and i!=hashdict[diff]:
                return[i, hashdict[diff]]
            hashdict[num] = i

复杂度分析:

  • 时间复杂度:O(n)
  • 空间复杂度:O(n):哈希表里存放了n个元素

效率:
执行时间从0.060s降低到了0.048s。

一遍哈希效率

相关文章

网友评论

    本文标题:leetcode 1. 两数之和 python实现

    本文链接:https://www.haomeiwen.com/subject/almmgctx.html