3.1 考慮的基本資料結構第一類:查詢有無–set元素』a』是否存在,通常用set:集合set只儲存鍵,而不需要對應其相應的值。set中的鍵不允許重複第二類:查詢對應關係(鍵值對應)–dict元素』a』出現了幾次:dict–>字典dict中的鍵不允許重複第三類:改變對映關係–map通過將原有序列的關係對映統一表示為其他
3.2 演算法應用
3.2.1 leetcode 349 intersection of two arrays
1題目描述給定兩個陣列nums,求兩個陣列的公共元素。如nums1 = [1,2,2,1],nums2 = [2,2]結果為[2]結果中每個元素只能出現一次出現的順序可以是任意的
分析實現由於每個元素只出現一次,因此不需要關注每個元素出現的次數,用set的資料結構就可以了。記錄元素的有和無。把nums1記錄為set,判斷nums2的元素是否在set中,是的話,就放在乙個公共的set中,最後公共的set就是我們要的結果。**如下:
def
intersection
(self, nums1: list[
int]
, nums2: list[
int])-
> list[
int]
: nums1 =
set(nums1)
return
set(
[i for i in nums2 if i in nums1]
)
也可以通過set的內建方法來實現,直接求set的交集:
class
solution
:def
intersection
(self, nums1: list[
int]
, nums2: list[
int])-
> list[
int]
: set1 =
set(nums1)
set2 =
set(nums2)
return set2 &
set
3.2.2 leetcode 350 intersection of two arrays 2
題目描述給定兩個陣列nums,求兩個陣列的交集。分析實現元素出現的次數有用,那麼對於儲存次數就是有意義的,所以選擇資料結構時,就應該選擇dict的結構,通過字典的比較來判斷;記錄每個元素的同時要記錄這個元素的頻次。記錄num1的字典,遍歷nums2,比較nums1的字典的nums的key是否大於零,從而進行判斷。
**如下:
class
solution
:def
intersect
(self, nums1: list[
int]
, nums2: list[
int])-
> list[
int]
:from collections import counter
nums1_dict = counter(nums1)
res =
for num in nums2:
if nums1_dict[num]
>0:
# 說明找到了乙個元素即在num1也在nums2
nums1_dict[num]-=1
return res
3.2.3 leetcode 242 intersection of two arrays 2
題目描述
給定兩個字串 s 和 t ,編寫乙個函式來判斷 t 是否是 s 的字母異位詞。分析實現判斷異位詞即判斷變換位置後的字串和原來是否相同,那麼不僅需要儲存元素,還需要記錄元素的個數。可以選擇dict的資料結構,將字串s和t都用dict儲存,而後直接比較兩個dict是否相同。
class
solution
:def
isanagram
(self, s:
str, t:
str)
->
bool
:from collections import counter
s = counter(s)
t = counter(t)
if s == t:
return
true
else
:return
false
class
solution
:def
(self, n:
int)
->
bool
: already =
set(
)while n !=1:
sum=
0while n >0:
# 取n的最後一位數
tmp = n %
10sum
+= tmp **
2# 將n的最後一位截掉
n //=
10# 如果求的和在過程**現過
ifsum
in already:
return
false
else
: already.add(
sum)
n =sumreturn
3.2.5 leetcode 290 word pattern
題目描述
給出乙個模式(pattern)以及乙個字串,判斷這個字串是否符合模式分析實現抓住變與不變,筆者開始的思路是選擇了dict的資料結構,比較count值和dict對應的keys的個數是否相同,但是這樣無法判斷順序的關係,如測試用例:『aba』,『cat cat dog』。那麼如何能既考慮順序,也考慮鍵值對應的關係呢?抓住變與不變,變的是鍵,但是不變的是各個字典中,對應的相同index下的值,如dict1[index] = dict2[index],那麼我們可以建立兩個新的字典,遍歷index對兩個新的字典賦值,並比較value。還有乙個思路比較巧妙,既然不同,那麼可以考慮怎麼讓它們相同,將原來的dict通過map對映為相同的key,再比較相同key的dict是否相同。
class
solution
:def
wordpattern
(self,pattern,
str)
:str
=str
.split(
)return
list
(map
(pattern.index,pattern))==
list
(map
(str
.index,
str)
)
3.2.6 leetcode 205 isomorphic strings
題目描述
給定兩個字串 s 和 t,判斷它們是否是同構的。如果 s 中的字元可以被替換得到 t ,那麼這兩個字串是同構的。所有出現的字元都必須用另乙個字元替換,同時保留字元的順序。兩個字元不能對映到同乙個字元上,但字元可以對映自己本身。分析實現思路與上題一致,可以考慮通過建兩個dict,比較怎樣不同,也可以將不同轉化為相同。
class
solution
:def
isisomorphic
(self, s:
str, t:
str)
->
bool
:return
list
(map
(s.index,s))==
list
(map
(t.index,t)
)
3.2.7 leetcode 451 sort characters by frequency
題目描述
給定乙個字串,請將字串裡的字元按照出現的頻率降序排列。分析實現對於相同頻次的字母,順序任意,需要考慮大小寫,返回的是字串。使用字典統計頻率,對字典的value進行排序,最終根據key的字串乘上value次數,組合在一起輸出。
class
solution
:def
frequencysort
(self, s:
str)
->
str:
from collections import counter
s_dict = counter(s)
# sorted返回的是列表元組
s =sorted
(s_dict.items(
), key=
lambda item:item[1]
, reverse =
true
)# 因為返回的是字串
res =
''for key, value in s:
res += key * value
return res
Datawhale公益AI組隊學習Task3 5
一類是模型無法得到較低的訓練誤差,我們將這一現象稱作欠擬合 underfitting 另一類是模型的訓練誤差遠小於它在測試資料集上的誤差,我們稱該現象為過擬合 overfitting 在實踐中,我們要盡可能同時應對欠擬合和過擬合。雖然有很多因素可能導致這兩種擬合問題,在這裡我們重點討論兩個因素 模型...
開始刷題LeetCode
今天決定開始刷題,每天至少一題,如果題目確實沒有解決出來沒有關係,但是要保證每天至少接觸了一道新的題目!一定要堅持下去,現在是個菜鳥可能會感覺有點難度,堅持下去,總有一天會好的!今天是第一天,做的第乙個題目 reverse words in a string given an input strin...
leetcode刷題歷程
難度 簡單 題目 給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 ...