您的位置:首页 > 新闻 > 会展 > 【hot100篇-python刷题记录】【两数之和】

【hot100篇-python刷题记录】【两数之和】

2025/1/12 23:20:22 来源:https://blog.csdn.net/m0_73629042/article/details/141291279  浏览:    关键词:【hot100篇-python刷题记录】【两数之和】

LeetCode 热题 100 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台

悲壮的R4-零基础入门篇终于在短暂的休息后告别了,

即将迎来的是重磅重温默写复写思路篇。

R5-哈希篇

一个月了,还是用回了老算法

经典两层遍历

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

 

我得专注于思考一些优化的方法以及优化的原理了,而不是仅仅在于解决问题。

需要用到哈希表

由于哈希表查找为O(1)复杂度,简化两层循环在于找到i和j之间的关联,关联点在于target是和

所以我们可以遍历一层哈希表,key是值,value是下标。

原理相当于将第二层循环简化成查找是否有key2=target-key1

class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:n=len(nums)dict=defaultdict(int)#记录下标for i in range(n):dict[nums[i]]=i#遍历for i in dict.keys():j=target-iif i!=j and j in dict.keys():return [dict[i],dict[j]]#查找不到return []

有问题

在第一次遍历记录的时候,如果数组存在相等的两个数,就只会记录最后一个数的下标,这显然不是我们想要的。

所以我们调整,根据下标记录值,保证了不可重复性。

 

class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:n=len(nums)dict=defaultdict(int)#记录下标for i in range(n):dict[i]=nums[i]#遍历for i in dict.keys():for j in dict.keys():if i!=j and dict[i]+dict[j]==target:return [i,j]#查找不到return []

这个版本没有优化成功

优化方法:

不用事先去记录哈希表初始化

在遍历数组的同时,查找target-num1是否在哈希表中即可。

class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:dict=defaultdict(int)#记录下标for i,num in enumerate(nums):num2=target-numif num2 in dict:return [dict[num2],i]dict[num]=ireturn []

之所以不会出现上面的案例不通过的情况是,他没有初始化哈希表,所以避免了两个相同值记录下标的问题,由于题目给出对于每个输入只能有一个答案,所以不会出现3个相同的值。 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com