【哈希表】理论知识的应用题。万变不离其宗!
454.四数相加II
很好,看到这道题的第一反应就是四个for循环,时间复杂度直接拉满O(n^4)。好好好。
后来看了讲解,有了深刻又粗浅的理解:
本题主要考察对哈希表的运用,思路很像“两数之和”(两数之和思路)。我们需要把4个数组分成两组,一组包含两个,也就是:1)nums1+nums2,2)0-(nums3+nums4)。分开遍历,直接将O(n^4)降低为O(n^2)。
其中,我们将数组1与数组2的值相加存入字典,key为两数相加的和,value为这个和出现的次数。
数组3和数组4相加时,则判断目标值与和的差,是否在上述字典中出现过。一涉及到“判断一个元素是否出现过”的题目就是哈希法!如果在,就count+该key对应的value。为啥是加value而不是加一,大家可以自己举个例子手算一下就懂了,大概就是用到排列组合的知识。
最后,就还是要熟悉字典的使用规范。
class Solution:
def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
hashmap = dict()
count = 0
for a in nums1:
for b in nums2:
if a+b in hashmap:
hashmap[a+b] += 1
else:
hashmap[a+b] = 1
for c in nums3:
for d in nums4:
if 0-(c+d) in hashmap:
count += hashmap[0-(c+d)]
return count
383.赎金信
OMG,自己写的一遍过!我宣布我正在变强!
本题与“有效字母异位词”很像(异位词思路)。主体思路可学习,但不同点在于,本题不是互相组成,而是判断字符串1是否可以由字符串b组成,也就是字符串2的字母数量多于字符串1所包含的字母数量就行!!!
另外,题目只包含小写字母,数量固定,那么我们可以直接使用数组哈希法!
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
record1 = [0] * 26
record2 = [0] * 26
base = ord('a')
for i in ransomNote:
record1[ord(i) - base] += 1
for j in magazine:
record2[ord(j) - base] += 1
for i in range(26):
if record1[i] > record2[i]:
return False
i += 1
return True
227

被折叠的 条评论
为什么被折叠?



