LeetCode 第181場周賽解題報告

2021-10-04 06:12:56 字數 3446 閱讀 4659

因為資料量較小,可以使用o(n

2)o(n^2)

o(n2

)的暴力方案。借助 std::vector::insert 方法快速實現。

class

solution

return infovec;}}

;

先思考最直接的方法:

列舉每個數的因子。設最大值為m

mm,則時間複雜度為o(n

∗m)o(n*m)

o(n∗m)

。檢查每個數因子的個數,並累加符合要求的因子。時間複雜度為o(n

)o(n)

o(n)。

因為 n,m 都較大,直接按上述方法暴力肯定是要超時的。那麼來思考下如何優化。

觀察發現,耗時主要集中在第一步,那麼就來搞一搞它!

我們現在時先列舉數字,再列舉它的因子,那麼能不能反過來呢?先列舉因子,然後列舉有可能被該因子整除的數字。好像是可行的,不過別慌,先讓我們來估計下時間複雜度:

列舉因子。設最大因子為m

mm,則時間複雜度為o(m

)o(m)

o(m)

。對於每個因子 x 。列舉可以被其整除的數字。設最大的數字取值不超過 n,則該步驟的時間複雜度為 o(n

/x)o(n/x)

o(n/x)

。 總結一下,上述演算法的時間複雜度為 o(m

∗n)o(m*\sqrt n)

o(m∗n​

)。已經足夠解決題目給出的資料了。

bool flag =

false

;unordered_map<

int, unordered_set<

int>> eledict;

void

init()

}}class

solution

int sum =0;

for(

auto it = nums.

cbegin()

; it != nums.

cend()

;++it)}}

return sum;}}

;

典型的圖的優先搜尋問題。比較考驗處理細節的能力。

可以借助 std::queue 來機率待搜尋的點,借助 std::unordered_set 記錄已訪問的點。每次從 queue 的隊首取出待搜尋節點,記為 f,然後列舉 f 周圍的四個節點,根據題目給出的 street-type 判斷是否可達。

int dx=

;int dy=

;class

solution}if

(dir ==1)

}if(dir ==2)

}if(dir ==3)

}return

false;}

bool

hasvalidpath

(vector

int>>

& grid)

for(

int i =

0; i <

4; i++)if

(next.first <

0|| next.first >= grid.

size()

|| next.second <

0|| next.second >= grid[0]

.size()

)if(false

==isaccess

(grid[f.first]

[f.second]

, grid[next.first]

[next.second]

, i)

) q.

push

(next)

; mark.

insert

(next);}

}return

false;}

};

可以使用 hash 演算法,o(n)搞定該問題。

首先假設有乙個足夠大的資料型別可以裝下我們所需要的數字。後面會優化掉對該假設的依賴~

對於長度為 i 的字首,我們可以計算其hash值,計算公式如下:

p re

fix(

i)=∑

j=0i

−1∗(

s[i]

−′a′

)∗sa

ltjprefix(i) = \sum^_*(s[i]-'a')*salt^

prefix

(i)=

∑j=0

i−1​

∗(s[

i]−′

a′)∗

salt

j 對於長度為 i 的字尾,我們可以計算其hash值,設字串長度為 n,計算公式如下:

s uf

fix(

i)=∑

j=0i

−1(s

[n−i

+j]−

′a′)

∗sal

tjsuffix(i) = \sum_^(s[n-i+j]-'a')*salt^

suffix

(i)=

∑j=0

i−1​

(s[n

−i+j

]−′a

′)∗s

altj

salt 是乙個隨機數,但最好是乙個大的質數。

分析上述兩個公式會發現,如果長度為 i 的字首和字尾相等,那麼必然有 prefix(i) == suffix(i)。而且在滿足前述假設的前提下,不相等的字首和字尾必然有 prefix(i) ≠ suffix(i)。

但是可惜的是,並沒有在大多數程式語言中,並不存在這樣的資料型別。從而導致了hash值衝突的問題,即不相等的字首和字尾其hash值也有可能相同。那麼如何解決該問題呢?

借鑑於通用的解決hash衝突的辦法,我們可以增加 salt 的個數,以降低衝突的概率。當長度為 i 的字首和字尾對於所有salt都相等時,我們才認為其真正的相等。

leetcode 第181場周賽

第一次做周賽,只做出了兩道題,主要問題是數學基礎不牢並且對於字串kmp演算法沒掌握。因為資料量比較小,所以採取了暴力直接insert。輸入 nums 0,1,2,3,4 index 0,1,2,2,1 輸出 0,4,1,3,2 解釋 nums index target 0 0 0 1 1 0,1 2...

leetcode第 181 場周賽

給你兩個整數陣列nums和index。你需要按照以下規則建立目標陣列 請你返回目標陣列。題目保證數字插入位置總是存在。輸入 nums 0,1,2,3,4 index 0,1,2,2,1 輸出 0,4,1,3,2 解釋 nums index target 0 0 0 1 1 0,1 2 2 0,1,2...

leetcode 第132場周賽

愛麗絲和鮑勃一起玩遊戲,他們輪流行動。愛麗絲先手開局。最初,黑板上有乙個數字n。在每個玩家的回合,玩家需要執行以下操作 如果玩家無法執行這些操作,就會輸掉遊戲。只有在愛麗絲在遊戲中取得勝利時才返回true,否則返回false。假設兩個玩家都以最佳狀態參與遊戲。示例 1 輸入 2輸出 true解釋 愛...