leetcode 第 216 场周赛 整理
目錄
- 1662. 檢查兩個字符串數(shù)組是否相等
- 題目
- 自己代碼
- 5606. 具有給定數(shù)值的最小字符串
- 題目
- 自己代碼
- 貪心算法
- 1664. 生成平衡數(shù)組的方案數(shù)
- 題目
- 自己代碼
- 動態(tài)規(guī)劃優(yōu)化
- 1665. 完成所有任務的最少初始能量
- 題目
- 思路
1662. 檢查兩個字符串數(shù)組是否相等
題目
給你兩個字符串數(shù)組 word1 和 word2 。如果兩個數(shù)組表示的字符串相同,返回 true ;否則,返回 false 。
數(shù)組表示的字符串 是由數(shù)組中的所有元素 按順序 連接形成的字符串。
自己代碼
累加,然后判斷是否相等
class Solution { public:bool arrayStringsAreEqual(vector<string>& word1, vector<string>& word2) {string str1="";string str2="";for(int i=0;i<word1.size();i++){str1+=word1[i];}for(int i=0;i<word2.size();i++){str2+=word2[i];}if(str1==str2) return true;else return false;} };5606. 具有給定數(shù)值的最小字符串
題目
小寫字符 的 數(shù)值 是它在字母表中的位置(從 1 開始),因此 a 的數(shù)值為 1 ,b 的數(shù)值為 2 ,c 的數(shù)值為 3 ,以此類推。
字符串由若干小寫字符組成,字符串的數(shù)值 為各字符的數(shù)值之和。例如,字符串 “abe” 的數(shù)值等于 1 + 2 + 5 = 8 。
給你兩個整數(shù) n 和 k 。返回 長度 等于 n 且 數(shù)值 等于 k 的 字典序最小 的字符串。
自己代碼
記錄一下自己超時的代碼:
使用的回溯法,這一題使用回溯法并不好,字母越多,解空間樹就會越大,并且沒有使用高效的剪枝手段。
貪心算法
構造出的字符串字典序最小,可以考慮貪心地從字符串的開頭處開始構造,每次選擇一個滿足要求的最小字母。
假設我們當前構造到了某一個位置,包括此位置還剩下n’個位子沒有放入字符,并且這些位子的數(shù)值之和為k’;
那么如果我們放入字母c,那么剩余n’-1個位置以及k’-c的數(shù)值和必須滿足:
n’-1<=k’-c<=26(n’-1)
(位置數(shù) <= 位置數(shù)上的數(shù)值和 <= 位置數(shù)能放的最多的數(shù)值和);
這樣就能得到c的取值范圍:
k’ - 26(n’-1) <= c <= k’ - (n’-1)
這樣就能得到c的取值下限k’ - 26(n’-1);
如果下限小于等于0,我們?nèi)(這是我們能取的當中最小的)
如果下限大于0,那么選擇數(shù)值對應的字符。
總的來說,就是從第一位到最后一位都取當前能夠取的最小值,這樣就能保證構造出來的字符串字典序最小了。
按照這個思路寫一遍。
我他媽傻了,貪心也太牛了,學習了。
1664. 生成平衡數(shù)組的方案數(shù)
題目
給你一個整數(shù)數(shù)組 nums 。你需要選擇 恰好 一個下標(下標從 0 開始)并刪除對應的元素。請注意剩下元素的下標可能會因為刪除操作而發(fā)生改變。
比方說,如果 nums = [6,1,7,4,1] ,那么:
選擇刪除下標 1 ,剩下的數(shù)組為 nums = [6,7,4,1] 。
選擇刪除下標 2 ,剩下的數(shù)組為 nums = [6,1,4,1]。
選擇刪除下標 4 ,剩下的數(shù)組為 nums = [6,1,7,4] 。
如果一個數(shù)組滿足奇數(shù)下標元素的和與偶數(shù)下標元素的和相等,該數(shù)組就是一個 平衡數(shù)組 。
請你返回刪除操作后,剩下的數(shù)組 nums 是 平衡數(shù)組 的 方案數(shù) 。
自己代碼
又是一個超時代碼
先講講思路:
首先nums數(shù)組中的每個位置都定義四個相應數(shù)組:
分別用來記錄i之前的偶數(shù)之和,i之前的奇數(shù)之和,i之后的偶數(shù)之和,i之后的奇數(shù)之和。
然后開始遍歷這個數(shù)組,記錄每個位子的四個數(shù)組數(shù)值。
去除索引為i的元素后,i之前元素的奇偶性不變,i之后元素的奇偶性改變,即i之后奇/偶數(shù)下標元素的和變成了偶/奇數(shù)下標。
然后暴力解:滿足奇數(shù)下標元素的和與偶數(shù)下標元素的和相等
動態(tài)規(guī)劃優(yōu)化
之前超時很明顯就是四個數(shù)組值重復計算:i之前的偶數(shù)之和,i之前的奇數(shù)之和,i之后的偶數(shù)之和,i之后的奇數(shù)之和。
現(xiàn)在直接看下標,這樣不容易混淆,下標是偶數(shù),數(shù)組名字中就有even,下標是奇數(shù),名字中就有odd。
步驟如下:
需要特別注意的地方:
dp推導:
注意這里我們四個數(shù)組都不會將nums[i]包括進去的。
i為偶數(shù)的話,i-1是奇數(shù),所以左偶和[i] = 左偶和[i-1],左奇和[i] = 左奇和[i-1]+nums[i-1];
i為奇數(shù)的話,i-1是偶數(shù),所以左偶和[i] = 左偶和[i-1]+nums[i-1],左奇和[i] = 左奇和[i-1];
這樣一來,就能對計算i之前的偶數(shù)和,奇數(shù)和省下時序。沒必要每次都從i=0開始判斷累加。
其次,i右邊的偶數(shù)和,奇數(shù)和也沒必要通過for運算開始計算,而是只需要從sum_odd和sum_even中視情況減去左偶右偶、nums[i]即可。
這樣也是同時省下大把時序。
這一題當時并沒有做出來,是剛剛才想到的。
1665. 完成所有任務的最少初始能量
題目
給你一個任務數(shù)組 tasks ,其中 tasks[i] = [actuali, minimumi] :
actuali 是完成第 i 個任務 需要耗費 的實際能量。
minimumi 是開始第 i 個任務前需要達到的最低能量。
比方說,如果任務為 [10, 12] 且你當前的能量為 11 ,那么你不能開始這個任務。如果你當前的能量為 13 ,你可以完成這個任務,且完成它后剩余能量為 3 。
你可以按照 任意順序 完成任務。
請你返回完成所有任務的 最少 初始能量。
思路
觀察示例,可以發(fā)現(xiàn),完成的任務是按照最(低能量-實際能量)的大小來排序的,差越大的越先被執(zhí)行。
https://leetcode-cn.com/problems/minimum-initial-energy-to-finish-tasks/solution/wan-cheng-suo-you-ren-wu-de-zui-shao-chu-shi-neng-/
神仙題目,這里貼個代碼:
總結
以上是生活随笔為你收集整理的leetcode 第 216 场周赛 整理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “君平因世闲”下一句是什么
- 下一篇: 骨语剧情介绍