LeetCode-001 Two-Sum

0.简介

记录LeetCode刷题过程,每篇分为四部分,题目描述、解题思路、参考代码、复杂度分析

如有疑问欢迎讨论

GitHub地址:https://github.com/LoneRanger0504/LeetCode

1.题目描述

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

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

2.解题思路

最暴力的O(N^2)的方法就不说了,主要的思路是用空间换时间,用HashMap来加快查找速度,代价就是增加了空间复杂度。

使用HashMap又可以有两种方式,一遍遍历和两遍遍历:

(1)一遍Hash:对当前的元素值num,计算出target与num的差difference,判断difference是否已经在HashMap中:如果已经存在,且num与difference的下标不一样,则返回对应的下标;如果不存在,将num作为key,index作为value存到HashMap中

(2)两遍Hash:先遍历一遍输入数组,依次添加到HashMap中,第二次遍历再依次判断对应下标,思路与依次遍历相同

python中HashMap对应的数据结构是字典dict

字典的相关操作如下:

初始化:dic = {}

添加key-value对: dic[key] = value

获取value: dic.get(key)

判断是否有某个key: if key in dic.keys()

3.参考代码

#一遍Hash
        dic = {}
        for index, num in enumerate(nums):
            difference = target - num
            if difference in dic.keys() and index != dic.get(difference):
                return [dic.get(difference), index]
            dic[num] = index
#两遍Hash
        dic = {}
        res = [0]*2
        for index in range(len(nums)):
            dic[nums[index]] = index
        for i in range(len(nums)):
            difference = target - nums[i]
            if difference in dic.keys() and dic.get(difference) != i:
                res[0] = i
                res[1] = dic.get(difference)
                return res

4.复杂度分析

最暴力的双层循环时间复杂度自然是O(N^2),空间复杂度O(1)

使用HashMap之后,时间复杂度分为两块,遍历数组为O(N),HashMap查找为O(1),故总体为O(N)

空间复杂度为O(N)

Table of Contents

0.简介

1.题目描述

2.解题思路

3.参考代码

4.复杂度分析


猜你喜欢

转载自blog.csdn.net/whuty1304/article/details/88950258