程式碼隨想錄演算法訓練營第六天

Y荷兰豆Y發表於2024-06-09

雜湊表
常見的三種雜湊結構:陣列、set(集合)、map(對映)
要快速判斷一個元素是否出現集合裡,考慮雜湊法!

242.有效的字母異位詞

題目:給定兩個字串 s 和 t ,編寫一個函式來判斷 t 是否是 s 的字母異位詞。
注意:若 s 和 t 中每個字元出現的次數都相同,則稱 s 和 t 互為字母異位詞。

解題:

思路:將 a ~ z 的字元對映到陣列 hush [0 ~ 25],對s和t字串統計每個字元出現的頻率,相減如果hush[0~26]都為0就表示出現頻率相等。

  1. 如何將 a ~ z 對映到 0 ~ 25 ?透過ASCII碼的相對值作為陣列下標:ord[i]-ord['a']
  2. 如何判斷是否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

解題:

經典思路:使用雜湊表儲存所有元素,再判斷後儲存結果。

  1. 雜湊表的資料結構的選擇?如果雜湊值比較少、特別分散、跨度非常大,使用陣列就造成空間的極大浪費!
    nums[i]值小於1000,可以用nums中的數值num作為下標。有限時:num可以作為陣列下標;無限時:num可以作為集合的元素,也可以作為字典的鍵。
  2. 交集結果的資料結構的選擇?集合:判斷是否出現;陣列:判斷相乘是否為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()
關鍵在於如何選取資料結構,判斷什麼是下標

相關文章