Leetcode 1.两数之和

【语录】

“有人相爱,有人夜里看海,有人Leetcode第一题都做不出来” —来自热评

 

【题目】

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

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

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

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

提示:

2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109

只会存在一个有效答案
进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?

 

方法一:【我的解法】

如果一个for循环解决不了的问题,那就两个。

class Solution(object):
    def twoSum(self, nums, target):
        for x in range(1,len(nums)):
            for y in range(0,x):
                if nums[x]+nums[y]==target:
                    return [y,x]

 

复杂度分析

  • 时间复杂度:O(N^2),其中 N 是数组中的元素数量;最坏情况下数组中任意两个数都要被匹配一次
  • 空间复杂度:O(1)

 

方法二:【哈希表】

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        res ={}
        for i, j in enumerate(nums):
            if (target-j) in res.keys():
                 return [res[target - j],i]
            else:
                res[j] = i

 

Python内置函数之enumerate() 函数

  • enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
  • 语法:enumerate(sequence, [start=0])

 

思路分析

  • 注意到方法一的时间复杂度较高的原因是寻找 target - x 的时间复杂度过高
  • 可以采用建立哈希表的方式,对于单个未知数x,利用哈希表寻找target-x的时间复杂度可以降为O(1)

 

复杂度分析

  • 时间复杂度:O(N),其中 N 是数组中的元素数量。对于每一个元素 x,我们可以 O(1) 地寻找 target - x
  • 空间复杂度:O(N),其中 N 是数组中的元素数量。主要为哈希表的开销

 

什么是哈希表?

  • 哈希表是一种数据结构
  • 哈希表表示了关键码值和记录的映射关系
  • 与普通的列表不同的地方在于,普通列表仅能通过下标来获取目标位置的值,而哈希表可以根据给定的key计算得到目标位置的值。
posted @ 2022-11-14 00:22  青山原  阅读(20)  评论(0编辑  收藏  举报