Leetcode 周賽 201 題解

2022-06-12 20:27:11 字數 1858 閱讀 2169

給定正整數\(n(\leq 20)\)與\(k\),二進位制串\(s_n\)形成規則有:

現要返回\(s_n\)的第\(k\)位字元

如:\(n=3,k=1\),可以得到\(s_3=「0111001」\),其第一位為"0",故返回"0"

本來想打表,但最後的串實在是長。我們不必從n=1一步步模擬整個過程,而是自頂而下深入遞迴,只關心第\(k\)位屬於上一步形成的01串的哪個位置哪個字元。

我們容易推出,對於\(s_n\)形成的串為\(2^n-1\)長度的01串,我們比較\(k\)與\(2^\)的大小:

class solution 

char findkthbit(int n, int k) }};

給定陣列nums(長度不大於\(1e5\)) 和乙個整數target。現要返回非空不重疊子陣列的最大數目,且每個子陣列中數字和都為target

nums = [-1,3,5,1,4,2,-9], target = 6,總共有 3 個子陣列和為 6 。 $([5,1], [4,2], [3,5,1,4,2,-9]) $但只有前 2 個是不重疊的。

dp[i]表示前i位滿足要求的陣列個數;sum表示[1, size]的字首和(先假定從1計數)

當\(i>0\)顯然dp[0] = 0;當\(i>0\)時,有兩種情況:

即得到轉移方程:\(dp[i] = max(dp[i-1], dp[pos]+1)\)

不存在這樣的\(pos\),顯然轉移方程只能為\(dp[i] = dp[i-1]\)

class solution ;

public:

mapmymap;

int sum = 0; mymap[0] = 0;

for (int i = 1; i <= nums.size(); i++)

else

mymap[sum] = i; //記錄字首和sum的最新位置

}return dp[nums.size()];}};

給定長度為\(n\)個單位的木棍,及記錄你要將棍子切開的位置陣列\(cuts[i]\),現要你按\(cuts[i]\)記錄的位置按一定順序切割木棍,使得成本最小,並求其值。其中每次切割的成本是當前要切割的棍子的長度。

顯然是石子合併的變式,區間dp題,不過我們需要預處理下每個切割位置之間的長度(該位置的序號-前一位置的序號),同時將代價陣列sum從1計數,便於dp

class solution ;

int dp[105][105];

public:

int cost(int lo, int hi)

void init(int maxlen, vector& cuts, int n)

sum[maxlen] = sum[maxlen - 1] + n - cuts[cuts.size() - 1];

}int mincost(int n, vector& cuts)

}return dp[1][maxlen];}};

LeetCode 第201場周賽題解報告

知識點 棧如果棧滿足上述兩個條件,則彈出棧頂的兩個元素。最後棧內的字元即為答案 class solution return stack 知識點 預處理因為只會對前 20 個 s 進行詢問,所以可以先預處理出s1,s2,s2 s20。這樣對於每次詢問就可以o 1 的給出答案了 全區變數,用於儲存 s1...

LeetCode 第 201 場周賽

手速慢,掛兩發。給你乙個由大小寫英文本母組成的字串s。乙個整理好的字串中,兩個相鄰字元s i 和s i 1 不會同時滿足下述條件 請你將字串整理好,每次你都可以從字串中選出滿足上述條件的兩個相鄰字元並刪除,直到字串整理好為止。請返回整理好的字串。題目保證在給出的約束條件下,測試樣例對應的答案是唯一的...

第 201 場力扣周賽題解

極限過題,最後30s才debug出來,真滴菜。5483.整理字串 思路 按照題目要求來即可,乙個小坑點是刪除了兩個字元後原本不相鄰的字元變得相鄰,因此需要注意一下。class solution while st.isempty return str.reverse tostring 5484.找出第...