雜湊表
常見的三種雜湊結構:陣列、set(集合)、map(對映)
要快速判斷一個元素是否出現集合裡,考慮雜湊法!
242.有效的字母異位詞
題目:給定兩個字串 s 和 t ,編寫一個函式來判斷 t 是否是 s 的字母異位詞。
注意:若 s 和 t 中每個字元出現的次數都相同,則稱 s 和 t 互為字母異位詞。
解題:
思路:將 a ~ z 的字元對映到陣列 hush [0 ~ 25],對s和t字串統計每個字元出現的頻率,相減如果hush[0~26]都為0就表示出現頻率相等。
- 如何將 a ~ z 對映到 0 ~ 25 ?透過ASCII碼的相對值作為陣列下標:ord[i]-ord['a']
- 如何判斷是否s、t是否是字母異位詞?透過相減:hush[0~25]均=0
注:1.不用分別統計頻率,統計t的時候,直接在統計s求得的hush[]基礎上相減;
2.python不能直接對字元進行運算,要用ord()求ASCII碼值;
3.s是字串,for i in s:i就是字元。
點選檢視程式碼
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
hush=[0]*26
for i in s:
hush[ord(i)-ord('a')]+=1
for i in t:
hush[ord(i)-ord('a')]-=1
for i in range(26):
if hush[i]!=0:
return False
return True
349. 兩個陣列的交集
題目:給定兩個陣列 nums1 和 nums2 ,返回 它們的 交集 。輸出結果中的每個元素一定是 唯一 的。我們可以 不考慮輸出結果的順序 。
提示:0 <= nums1[i], nums2[i] <= 1000
解題:
經典思路:使用雜湊表儲存所有元素,再判斷後儲存結果。
- 雜湊表的資料結構的選擇?如果雜湊值比較少、特別分散、跨度非常大,使用陣列就造成空間的極大浪費!
nums[i]值小於1000,可以用nums中的數值num作為下標。有限時:num可以作為陣列下標;無限時:num可以作為集合的元素,也可以作為字典的鍵。 - 交集結果的資料結構的選擇?集合:判斷是否出現;陣列:判斷相乘是否為0。
一、都用集合,python寫法太簡潔了!
點選檢視程式碼
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
return list(set(nums1)&set(nums2))
二、陣列
點選檢視程式碼
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
list1=[0]*1001
list2=[0]*1001
res=[]
for i in range(len(nums1)):
list1[nums1[i]]+=1
for i in range(len(nums2)):
list2[nums2[i]]+=1
for i in range(1001):
if list1[i]*list2[i]!=0:
res.append(i)
return res
三、
心得:
集合增加元素:res.add()
陣列增加元素:res.append()
關鍵在於如何選取資料結構,判斷什麼是下標