前言
从今天开始好好刷leetcode,顺便记录一下,做个笔记。说来惭愧,博主算法书看了好多,但是实战经验还是很欠缺,导致了对算法的研究仅仅停留在了解这种程度,缺乏实战。于是开始了LeetCode刷题之旅,从第一题刷起来~
LeetCode中文官网
题目描述
给定一个整数数列,找出其中和为特定值的那两个数。
你可以假设每个输入都只会有一种答案,同样的元素不能被重用。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
题目分析
解法一:暴力搜索,暴力法很简单,遍历每个元素 xx,并查找是否存在一个值与 target -x 相等的目标元素。
首先i在数组里循环一轮,在每个i循环下,从剩下的元素找target-nums[i]的值。找到了,就return [i,j]。
解法二:一次for循环
解法三:用字典模拟哈希求解,关于hash table(哈希表),简单来说就是存有键值对key,value的一种数据结构,对于熟悉Python的人来说,常见的字典就是一种hash table。它的查找速度是很快的,可以理解为O(1)。所以这里相当于在解法2的基础上做了一个改进。解法2 是在空间不变的前提下,在i循环时,直接在列表里查找是否含有target-nums[0]的元素,而列表的查找速度是远不如hash table。
代码
解法一:暴力搜索
class Solution(object):
def TwoSum(self,nums,target):
lens=len(nums)
print(lens)
for i in range(lens):
num=target-nums[i]
if num in nums:
j=nums.index(num)
# 当取得两个下标不一样时,才会停止循环,return
if i!=j:
return [i,j] if i<j else [j,i]
solu=Solution()
print(solu.TwoSum([1,2,3,4],6))
解法二:一次for循环
class Solution(object):
def TwoSum_dict(self,nums,target):
_dict = {}
for i, m in enumerate(nums):
_dict[m] = i
for i, m in enumerate(nums):
j = _dict.get(target - m)
if j is not None and i != j:
return [i, j]
解法三:用字典模拟哈希求解
class Solution1(object):
def TwoSum_dict(self,nums,target):
_dict = {}
for i, m in enumerate(nums):
_dict[m] = i
for i, m in enumerate(nums):
j = _dict.get(target - m)
if j is not None and i != j:
return [i, j]
hash table查找提升效率,比第一种快了3倍左右。
参考:https://blog.csdn.net/ssswill/article/details/84824667
https://leetcode-cn.com/problems/two-sum/solution/liang-shu-zhi-he-by-leetcode-2/
注意
需要注意会错的是要判断一下上面代码中i的值和你找到的数组下标值是否相同,比如{3,2,4} target = 6, 会不会出现返回 0 0 这种错。