最近为了准备春招又开始做LeetCode了,先上一年前做题时的提交记录:
可见当时应该是第一次刷题,一开始应该是用两层for循环做的,能通过,但是时间复杂度是O(N^2),估计是后来偷看了答案,发现比较好的做法是用哈希表,于是记忆着评论着别人的代码稀里糊涂的就以O(N)的时间复杂度通过了。。。。(估计那个时候还内心狂喜,装逼地在心里说着学到了学到了,想着自己又变强了呀。。。囧)
于是今天分类复习哈希表这块挑了几道题做的时候又遇到了这一题,于是凭着自己“优秀”的记忆力,写出了如下的代码:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
numIndexDict = {}
for index, num in enumerate(nums):
numIndexDict[num] = index
for num in nums:
if target - num in nums and numIndexDict[num] != numIndexDict[target - num]:
return [numIndexDict[num], numIndexDict[target - num]]
return []
内心OS: “这题不是很简单嘛,先把数组所有的元素作为字典的key,下标作为value,这样等下面判断if target - num in nums
的时候就可以把对应的下标输出了呀,嘿嘿嘿,so easy。”
然而,现实是残酷的,力扣给出的评分结果是:解答错误!!!
看到给出的输入[3, 3]的时候我就明白了,我这种先把数组遍历一遍把对应的值和下标作为key和value存到字典里其实相当于set()了一下,把不同下标但是值相同的元素去重了(这样其实会导致target = 6, 数组中有两个3的时候,其实应该返回这两个元素对应的下标,但是因为在我建哈希表的时候,这两个元素已经被我在哈希表中“变成一个元素了”,也就是我写的这句判断代码
if target - num in nums and numIndexDict[num] != numIndexDict[target - num]:
return [numIndexDict[num], numIndexDict[target - num]]
是进不来的,最终肯定走到return []去了。。)
那如何避免我的这种情况呢?(当然大佬们是不会犯我这种错误的。。。)。 其实可以从前往后依次遍历数组的时候,判断target - num是否在我们的哈希表中( 刚刚自己写代码的时候突然对于符合判断元素是否在哈希表中纠结是否能否通过 key in dict的方式来判断,查了一下,网上是这么说的(Python 字典 in 操作符用于判断键是否存在于字典中,如果键在字典 dict 里返回 true,否则返回 false。),所以还是要自己真的去动手写,去思考啊。。。),如果不在的话,就把(元素,下标)作为(key, value)存到自己建的字典中。如果在的话,就可以 return 哈希表中对应元素的value了。 大致可以写出如下代码:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
indexNumDict = {}
for index, num in enumerate(nums):
if target - num in indexNumDict:
return index, indexNumDict[target - num]
indexNumDict[num] = index
return []
这样其实可以避免我上面出现的问题。比如还是数组 = [3, 3],target = 6的时候,第一次判断target - 3在不在哈希表中,结果是不在的,然后存入哈希表。第二次判断target - 第二个3的时候查询哈希表,发现 target - 3 = 3这个key已经在哈希表中了,所以果断 return index, indexNumDict[target - num]
。
就这一题其实可以反映我自身的问题,我从初中的时候其实就养成了一个很不好的习惯,在面临考试这样的任务,或者一味追求数量的时候,我会尝试着用大脑去记住所有的解法,这种方法也许在逻辑简单,知识简单的情况下可以记住90%甚至更高的解题方法,但是这种方式也在扼杀自己养成真正去思考知识背后的逻辑,也就是真正的理解,到高中之后知识变得庞杂,变得更有深度的时候,记忆程度有限的大脑只会变得疲惫,并且失去思考的真正乐趣。。 所以正如前几天我问实习的一个小伙伴说我做题之后就都忘了他给我的建议——“刷题的时候至少要有连续的投入三小时以上,有时候一上午做一两道题都是很正常的,要去理解,而不是记忆”。单纯的记忆不理解也许短期内能记住,但是理解了之后才是 long-term memory,才能体会到思考的乐趣,形成正向激励,这才是正道(当然如果都到面试前几天了,那就背吧!😂😂😂)。