LeetCode周賽 204 題解

2022-06-12 20:21:16 字數 3120 閱讀 3544

給定正整數陣列arr,請你找出乙個長度為m且在陣列中至少重複k次的模式。

模式是由乙個或多個值組成的子陣列(連續的子串行),連續重複多次但不重疊。 模式由其長度和重複次數定義。如果陣列中存在至少重複k次且長度為m的模式,則返回true,否則返回false

題目初看有點麻煩,但實際上隔著特定週期(即重複長度)去檢查相應字元是否相等,模擬一下題意即可。

class solution 

if(i + m >= len) break; //越界

if(arr[i] == arr[i + m]) tmp++;

else

}return cnt >= k - 1;}};

給定整數陣列nums,請你求出乘積為正數的最長子陣列的長度。其中,乙個陣列的子陣列是由原陣列中零個或者更多個連續數字組成的陣列。

我的版本(**略長)

class solution 

else if(nums[i] < 0)

if(last == false) mymax = max(mymax, cnt); //只有當前面的負號全消掉的時候方能更新答案

}/*從右至左遍歷*/

cnt = 0; last = false;

for(int i = len - 1; i >= 0; i--)

else if(nums[i] < 0)

if(last == false) mymax = max(mymax, cnt);

}return (mymax == -0x3f3f3f3f) ? cnt - 1 : mymax; //避免全為負數}};

\(@xu012\)的佇列版本,易寫,不過複雜度有點高

class solution 

else if(nums[i] < 0) myque.push(i);

if(myque.size() % 2 == 0)

ans = max(ans, i - last); //當前數字下標-上乙個0的下標

else

ans = max(ans, i - myque.front());

}return ans;}};

給定陣列nums表示 1 到 n 的乙個排列。按照元素在nums中的順序依次插入乙個初始為空的二叉查詢樹。請你統計將nums重新排序後,統計滿足如下條件的方案數:重排後得到的二叉查詢樹與nums原本數字順序得到的二叉查詢樹相同,將結果對 10^9 + 7 取餘數。

顯然第乙個插入的元素必為根節點,設為rt,通過rt的大小,我們就能決定陣列後面的元素如何劃分至左右子樹。我們設lo表示小於rt的元素構成的集合,hi表示大於rt元素集合,顯然lohi分別代表左、右子樹節點集。

觀察到,無論我先從lo集合中取元素插入rt左子樹,還是我先從hi集合取元素插入右子樹,樹的拓撲結構並不影響,簡單來說,兩個大集合誰先誰後插入搜尋樹中,都不會發生相互影響。

那麼,集合內部的元素插入順序是否影響呢?我們回想第一句話,第乙個插入元素必為根節點。改變了第乙個插入的元素,就會使得新樹的結構不再於給定的原樹結構相同了。

我們只要保證左子樹的元素內部相對順序,以及右子樹的元素內部相對順序,調整兩種集合的插入順序,能夠獲得新插入序列,但不影響原樹的結構。

如何統計?從n個元素中將k個元素(均屬於某一集合)挑選出來,同時保證這k個元素相對順序相同(需要去序),共有\(c^_n\)(或\(c^_\))個組合。當然我們只是將兩個大集合的組合統計了,大集合內部同樣有如此的統計方式,由乘法原理得到\(f(n) = f(lo)\times f(hi) \times c^_\)

typedef long long ll;

ll c[1010][1010];

class solution //遞推過程類似於01揹包

}int dfs(vector& arr) //劃分左右子樹

ll cur = c[lo.size() + hi.size()][lo.size()];

cur = (cur * dfs(lo)) % mod;

cur = (cur * dfs(hi)) % mod;

return cur % mod;

}int numofways(vector& nums)

};

給你乙個由若干01組成的二維網格grid,其中0表示水,而1表示陸地。島嶼由水平方向或豎直方向上相鄰的1(陸地)連線形成。

如果恰好只有一座島嶼,則認為陸地是連通的;否則,陸地就是分離的。一天內,可以將任何單個陸地單元(1)更改為水單元(0)。現要求使陸地分離的最少天數。

tarjan割點的演算法我還沒學,暫時先咕

其實該題有個漏洞,所有島嶼都有小邊角,只要將小邊角切出一塊即可,也就說最多天數為2。

LeetCode 第 204 場周賽題解

知識點 列舉 這道題太直白了,沒啥花裡胡哨的東西,直接列舉起點,然後檢查是否至少有 k 段重複即可。class solution if flag else if hit 1 k return false 知識點 遞推設 pos i 是以 nums i 結尾,乘積為正的最長子陣列的長度。設 neg i...

Leetcode 周賽 203 題解

雖然直接模擬是乙個辦法,但是實際上兜了n圈之後最後多出來的部分就是所求 即 1 3 2 4 等效於 1 4 class solution def mostvisited self,n int,rounds list int list int s,e rounds 0 rounds 1 if s e ...

Leetcode 周賽 201 題解

給定正整數 n leq 20 與 k 二進位制串 s n 形成規則有 現要返回 s n 的第 k 位字元。如 n 3,k 1 可以得到 s 3 0111001 其第一位為 0 故返回 0 本來想打表,但最後的串實在是長。我們不必從n 1一步步模擬整個過程,而是自頂而下深入遞迴,只關心第 k 位屬於上...