復(fù)盤|2023.1每日一題
1.1題目?2351. 第一個(gè)出現(xiàn)兩次的字母
【哈希表】用哈希表或數(shù)組記錄每個(gè)字母出現(xiàn)的次數(shù)。空間復(fù)雜度O(C),C為字符串大小。
【位運(yùn)算】用一個(gè)mask記錄每個(gè)字母是否出現(xiàn)過,第i位表示第i個(gè)字母是否出現(xiàn)過??臻g復(fù)雜度O(1)
1.2題目?1801. 積壓訂單中的訂單總數(shù)
【優(yōu)先隊(duì)列(大小根堆) + 模擬】用優(yōu)先隊(duì)列(大小根堆)維護(hù)當(dāng)前的積壓訂單,其中大根堆buy維護(hù)積壓的采購訂單,小根堆sell維護(hù)積壓的銷售訂單。堆中每個(gè)元素是一個(gè)二元組(price,amount),表示價(jià)格為price的訂單數(shù)量為amount。遍歷訂單數(shù)組orders,根據(jù)題意模擬即可。遍歷結(jié)束后,將buy和sell中的訂單數(shù)量相加,即為最終的積壓訂單數(shù)量。
1.3題目?2042. 檢查句子中的數(shù)字是否遞增
【模擬】將字符串s按空格分割成若干個(gè)單詞。然后遍歷每個(gè)單詞,判斷其是否為數(shù)字。只判斷第一個(gè)字符即可。
1.4題目?1802. 有界數(shù)組中指定下標(biāo)處的最大值
【二分】確定了nums[index]的值為x,此時(shí)我們可以找到一個(gè)最小的數(shù)組總和。也就是說,在ndx左側(cè)的數(shù)組元素從x-1每次遞減1,如果減到1后還有剩余元素,那么剩余的元素都為1;同樣的,在imdx及右側(cè)的數(shù)組元素從x也是每次遞減1,如果減到1后還有剩余元素,那么剩余的元素也都為1??梢杂?jì)算出數(shù)組的總和,如果總和小于等于nazSum,那么此時(shí)的x是合法的。隨著x的增大,數(shù)組的總和也會(huì)增大,因此我們可以使用二分查找的方法,找到一個(gè)最大的且符合條件的x。
1.5題目?1803. 統(tǒng)計(jì)異或值在范圍內(nèi)的數(shù)對(duì)有多少
【哈希表】x ⊕ y = t 即 y = x ⊕ t。利用這個(gè)性質(zhì),統(tǒng)計(jì)nums每個(gè)數(shù)的出現(xiàn)次數(shù),存在哈希表cnt中,然后遍歷ct的每個(gè)鍵x,把cmt[x]·cnt[x⊕t]的結(jié)果記到答案中,由于遍歷到等于x⊕t的鍵時(shí)又重復(fù)統(tǒng)計(jì)了一次,所以最后答案要除以2。將[low,high]分成若干區(qū)間,直接計(jì)算每個(gè)區(qū)間的答案。代碼中high%2*cnt[(high-1)^x] 相當(dāng)于 cnt[(high-1)^x] if high%2 else 0。
1.6題目?2180. 統(tǒng)計(jì)各位數(shù)字之和為偶數(shù)的整數(shù)個(gè)數(shù)
【暴力枚舉】
【數(shù)學(xué)】位于區(qū)間[0, num]的整數(shù)可以分為兩個(gè)部分:區(qū)間[10×y + 0, 10×y + x],如果y的各位數(shù)字之和為偶數(shù),那么該區(qū)間內(nèi)各位數(shù)字之和為偶數(shù)的整數(shù)個(gè)數(shù)為?x/2?+1,奇數(shù)為?x/2?;區(qū)間[0, 10×y + 0],注意到該區(qū)間的數(shù)可以表示為10×t+g的形式,其中0≤t<y且0≤g<10。固定住t時(shí),如果t的各位數(shù)字之和為偶數(shù),那么g為偶數(shù)的取值數(shù)目為5,奇數(shù)時(shí)類似,因此該區(qū)間內(nèi)的各位數(shù)字之和為偶數(shù)的整數(shù)個(gè)數(shù)為y×5。注意到上述區(qū)間中我們多計(jì)入了整數(shù)0,因此結(jié)果應(yīng)該是位于上述區(qū)間且各位數(shù)字之和為偶數(shù)的個(gè)數(shù)減1。
1.7題目?1658. 將 x 減到 0 的最小操作數(shù)
【雙指針】把題目轉(zhuǎn)換為從nums中移除一個(gè)最長的子數(shù)組,使得剩余元素和為x。即找到最長的子數(shù)組,其元素和為sum(nums)-x。
1.8題目?2185. 統(tǒng)計(jì)包含給定前綴的字符串
【遍歷】按題意遍歷每個(gè)字符串。
1.9題目?1806. 還原排列的最少操作步數(shù)
【模擬】直接按題意模擬,偶數(shù)arr[i] = perm[i/2],奇數(shù)arr[i] = perm[n/2 + (i-1)/2],不斷循環(huán),直到perm變回原始狀態(tài)。
【數(shù)學(xué)】觀察原排列對(duì)應(yīng)的索引變化關(guān)系,·當(dāng)0≤i<n/2時(shí),此時(shí)g(i)=2i,當(dāng)n/2≤i<n時(shí),此時(shí)g(i)=2i-(n-1)。
1.10題目?753. 破解保險(xiǎn)箱
【歐拉回路】
1.11題目?2283. 判斷一個(gè)數(shù)的數(shù)字計(jì)數(shù)是否等于數(shù)位的值
【枚舉】統(tǒng)計(jì)字符串每個(gè)數(shù)字出現(xiàn)的次數(shù),枚舉每個(gè)數(shù)字,判斷其出現(xiàn)次數(shù)是否與其值相同。
1.12題目?1807. 替換字符串中的括號(hào)內(nèi)容
【哈希表】將knowledge保存到哈希表dict中,遍歷字符串。
1.13題目?2287. 重排字符形成目標(biāo)字符串
【哈希表】哈希表統(tǒng)計(jì)s和target中每個(gè)字符出現(xiàn)的次數(shù),對(duì)于target中每個(gè)字符,計(jì)算cnt1中該字符出現(xiàn)次數(shù)除以cnt2中該字符出現(xiàn)次數(shù),取最小值。
1.14題目?1819. 序列中不同最大公約數(shù)的數(shù)目
【枚舉 + 數(shù)學(xué)】對(duì)于數(shù)組nums的所有子序列,其最大公約數(shù)一定不超過數(shù)組中的最大值x。因此可以枚舉[1,mx]中的每個(gè)數(shù)x,判斷x是否為數(shù)組nums的子序列的最大公約數(shù),如果是,則答案加一。那么問題轉(zhuǎn)換為:判斷x是否為數(shù)組nums的子序列的最大公約數(shù)。我們可以通過枚舉x的倍數(shù)y,判斷y是否在數(shù)組nums中,如果y在數(shù)組nums中,則計(jì)算y的最大公約數(shù)g,如果出現(xiàn)g=x,則x是數(shù)組nums的子序列的最大公約數(shù)。
1.15題目?2293. 極大極小游戲
【模擬】按題意模擬,直接在原數(shù)組上操作。
1.16題目?1813. 句子相似性 III
【雙指針】i表示兩個(gè)字符串?dāng)?shù)組從左開始最多有i個(gè)字符串相同。j表示剩下的字符串?dāng)?shù)組從右開始,最多有j個(gè)字符串相同。如果i+j正好是某個(gè)字符串?dāng)?shù)組的長度,那么原字符串就是相似的。
1.17題目?1814. 統(tǒng)計(jì)一個(gè)數(shù)組中好對(duì)子的數(shù)目
【哈希表】哈希表里存 x - rev(x) = y - rev(y)。遍歷的同時(shí)添加。
1.18題目?1825. 求出 MK 平均值
【有序集合 + 隊(duì)列】維護(hù)以下數(shù)據(jù)結(jié)構(gòu)或變量:一個(gè)長度為m的隊(duì)列q,隊(duì)首元素為最早加入的元素,隊(duì)尾元素為最近加入的元素;三個(gè)有序集合,分別為lo,mid,hi,其中l(wèi)o和hi分別存最小的k個(gè)元素和最大的k個(gè)元素,mid存剩下的元素;變量s存mid中所有元素和。
1.19題目?2299. 強(qiáng)密碼檢驗(yàn)器 II
【模擬 + 位運(yùn)算】按題意模擬,用mask記錄密碼是否包含小寫、大寫、數(shù)字和特殊字符。
1.20題目?1817. 查找用戶活躍分鐘數(shù)
【哈希表】用哈希表記錄每個(gè)用戶的去重操作時(shí)間,遍歷哈希表統(tǒng)計(jì)每個(gè)用戶活躍分鐘數(shù)。
1.21題目?1824. 最少側(cè)跳次數(shù)
【DP】定義f[i] [j]表示青蛙到達(dá)第i個(gè)點(diǎn),且處于第j條跑道的最小側(cè)跳次數(shù)。注意到青蛙起始位置處于第2條跑道(題目這里下標(biāo)從1開始),因此f[0] [1] = 0, f[0] [0] = f[0] [2] = 1, ans = min(fi[n] [0], f[n] [1], f[n] [2])。對(duì)于i從1到n的每個(gè)位置,我們可以枚舉青蛙當(dāng)前所處的跑道j,如果obstacles[i]=j+1,說明第j條跑道上有障礙,此時(shí)f[i] [j]的值為正無窮;否則,青蛙可以選擇不跳躍,此時(shí)f[j的值為f[i-1] [j],或者青蛙可以從其它跑道側(cè)跳過來,此時(shí)f[i] [j] = min(f[i] [j], min(f[i] [0],f[i] [1],f[i] [2])+1)。
1.22題目?1815. 得到新鮮甜甜圈的最多組數(shù)
【貪心 + 狀態(tài)壓縮 + 記憶化搜索】設(shè)計(jì)一個(gè)函數(shù)dfs(state,mod),表示安排狀態(tài)為state,且當(dāng)前前綴余數(shù)為mod時(shí),能使得多少組感到開心。那么我們?cè)凇俺跏即鸢浮奔由蟙fs(state,0),即為最終答案。函數(shù)dfs(state,mod)的實(shí)現(xiàn)邏輯如下:我們枚舉1到batchSize-1的每一個(gè)余數(shù)i,如果余數(shù)i的數(shù)量不為0,那么我們可以將余數(shù)i的數(shù)量減去1,將當(dāng)前前綴余數(shù)加上i并且對(duì)batch Size取模,然后遞歸調(diào)用函數(shù)dfs,求出子狀態(tài)的最優(yōu)解,取最大值即可。最后判斷mod是否為0,如果為0,我們?cè)谧畲笾瞪霞?后返回,否則直接返回最大值。
1.23題目?2303. 計(jì)算應(yīng)繳稅款總額
【模擬】遍歷brackers,按題意模擬。
1.24題目?1828. 統(tǒng)計(jì)一個(gè)圓中點(diǎn)的數(shù)目
【枚舉】2重循環(huán),對(duì)于每個(gè)查詢枚舉所有點(diǎn),依次判斷是否在查詢的圓中。
1.25題目?1632. 矩陣轉(zhuǎn)換后的秩
【排序 + 并查集】簡化情形:沒有相同的元素。顯然最小的元素的秩為1,第二小的元素要考慮是否和最小元素同行或同列。得到貪心解法:從小到大遍歷元素,維護(hù)每行、每列的最大秩,該元素的秩即為同行、同列的最大秩加1。存在相同元素時(shí)則較為復(fù)雜,假設(shè)兩個(gè)相同元素同行(或同列),那么就要考慮到兩個(gè)元素分別對(duì)應(yīng)的行(或列)的最大秩。同時(shí)還可能出現(xiàn)聯(lián)動(dòng),比如元素a和b同行,b和c同列,那么要同時(shí)考慮這三個(gè)元素。想到并查集,用并查集將元素分為幾個(gè)連通塊,對(duì)于每個(gè)連通塊,里面所有元素對(duì)應(yīng)的行或列的最大秩加1,即為該連通塊內(nèi)所有元素的秩。
1.26題目?1663. 具有給定數(shù)值的最小字符串
【貪心】要求構(gòu)造長度為k的字符串且字符的數(shù)值之和為n,要使得構(gòu)造出的字符串字典序最小,可以貪心地從字符串左邊起始位置開始構(gòu)造,每次選擇一個(gè)滿足要求的最小字母。假設(shè)選了第i個(gè)位置的字符c,還剩下n-i個(gè)位置的字符這些字符的數(shù)值之和為k',字符最大為z',最小為a,可得n-i≤k'-c≤(n-i)×26,不等式轉(zhuǎn)換,k'-(n-i)×26≤c≤k-(n-i),c最小值為1,得到c的合法取值范圍為[max(1, k'-(n-i)×26), k-(n-i)]。
1.27題目?2309. 兼具大小寫的最好英文字母
【哈希表 + 枚舉】
【位運(yùn)算】優(yōu)化空間復(fù)雜度從O(C)到O(1)。用mask1和mask2分別記錄s出現(xiàn)的小寫和大寫字母,mask1的第i位表示第i個(gè)小寫字母是否出現(xiàn),mask2的第i位表示第i個(gè)大寫字母是否出現(xiàn)。mask1 & mask2,1是小寫和大寫同時(shí)出現(xiàn),找到1的最高位,將其轉(zhuǎn)換為對(duì)應(yīng)的大寫字母。
1.28題目?1664. 生成平衡數(shù)組的方案數(shù)
【枚舉】枚舉刪除nums[i],平衡條件是:左側(cè)奇位元素和+右側(cè)偶位元素和 = 左側(cè)偶位元素和 + 右側(cè)奇位元素和。初始化四個(gè)變量,然后一次遍歷nums[i],判斷是否平衡。
1.29題目?2315. 統(tǒng)計(jì)星號(hào)
【模擬】定義一個(gè)遍歷ok表示遇到*時(shí)能否計(jì)數(shù),初始=1可以計(jì)數(shù)。遍歷s,根據(jù)ok的值判斷是否計(jì)數(shù)。如果遇到|,則ok的值取反。
1.30題目?1669. 合并兩個(gè)鏈表
【雙指針模擬】按題意模擬。
1.31題目?2319. 判斷矩陣是否是一個(gè) X 矩陣
【模擬】對(duì)于grid每個(gè)位置(i,j),如果滿足i=j 或 i+j = n-1說明該點(diǎn)在對(duì)角線上。