LeetCode 第 23 场双周赛(970/2044,前47.5%)
文章目錄
- 1. 比賽結果
 - 2. 題目
 - 1. LeetCode 5360. 統計最大組的數目 easy
 - 2. LeetCode 5362. 構造 K 個回文字符串 medium
 - 3. LeetCode 5361. 圓和矩形是否有重疊 medium
 - 4. LeetCode 5363. 做菜順序 hard
 
1. 比賽結果
做出來了 1、3 兩題,繼續加油!
 第二道字符串的題,又是看錯題,以后要多讀幾遍題目,題目說要使用所有字符,我視而不見,去排列組合。。。
 第四題,想到了貪心,又轉到動態規劃去做,沒做出來。
全國排名:970 / 2044,47.5%;全球排名:2946 / 7026,42%
 
 
2. 題目
1. LeetCode 5360. 統計最大組的數目 easy
題目鏈接
給你一個整數 n 。請你先求出從 1 到 n 的每個整數 10 進制表示下的數位和(每一位上的數字相加),然后把數位和相等的數字放到同一個組中。
請你統計每個組中的數字數目,并返回數字數目并列最多的組有多少個。
示例 1: 輸入:n = 13 輸出:4 解釋:總共有 9 個組,將 1 到 13 按數位求和后這些組分別是: [1,10],[2,11],[3,12],[4,13],[5],[6],[7],[8],[9]。 總共有 4 個組擁有的數字并列最多。示例 2: 輸入:n = 2 輸出:2 解釋:總共有 2 個大小為 1 的組 [1],[2]。示例 3: 輸入:n = 15 輸出:6示例 4: 輸入:n = 24 輸出:5提示: 1 <= n <= 10^4解答:
class Solution { public:int countLargestGroup(int n) {unordered_map<int,int> m;int sum;for(int i = 1; i <= n; ++i){sum = cal(i);m[sum]++;}int maxlen = 0, count = 0;for(auto mi : m){if(mi.second > maxlen)//和一樣的,個數最多的{maxlen = mi.second;count = 1;}else if(mi.second == maxlen)count++;}return count;}int cal(int i){ //計算各數位的和int sum = 0;while(i){sum += i%10;i /= 10;}return sum;} };8 ms 6.4 MB
2. LeetCode 5362. 構造 K 個回文字符串 medium
題目鏈接
給你一個字符串 s 和一個整數 k 。請你用 s 字符串中 所有字符 構造 k 個非空 回文串 。
如果你可以用 s 中所有字符構造 k 個回文字符串,那么請你返回 True ,否則返回 False 。
示例 1: 輸入:s = "annabelle", k = 2 輸出:true 解釋:可以用 s 中所有字符構造 2 個回文字符串。 一些可行的構造方案包括:"anna" + "elble","anbna" + "elle","anellena" + "b"示例 2: 輸入:s = "leetcode", k = 3 輸出:false 解釋:無法用 s 中所有字符構造 3 個回文串。示例 3: 輸入:s = "true", k = 4 輸出:true 解釋:唯一可行的方案是讓 s 中每個字符單獨構成一個字符串。示例 4: 輸入:s = "yzyzyzyzyzyzyzy", k = 2 輸出:true 解釋:你只需要將所有的 z 放在一個字符串中,所有的 y 放在另一個字符串中。 那么兩個字符串都是回文串。示例 5: 輸入:s = "cr", k = 7 輸出:false 解釋:我們沒有足夠的字符去構造 7 個回文串。提示: 1 <= s.length <= 10^5 s 中所有字符都是小寫英文字母。 1 <= k <= 10^5解題:
- 奇數個字符出現的次數不能大于 k ,因為它只能放在中間
 - 然后字符串長度必須 >= k
 
60 ms 11.8 MB
3. LeetCode 5361. 圓和矩形是否有重疊 medium
題目鏈接
給你一個以 (radius, x_center, y_center) 表示的圓和一個與坐標軸平行的矩形 (x1, y1, x2, y2),
 其中 (x1, y1) 是矩形左下角的坐標,(x2, y2) 是右上角的坐標。
如果圓和矩形有重疊的部分,請你返回 True ,否則返回 False 。
換句話說,請你檢測是否 存在 點 (xi, yi) ,它既在圓上也在矩形上(兩者都包括點落在邊界上的情況)。
解題:
 
- 檢查圓心是否在綠色或者藍色的矩形內(原矩形為紅色,偏移距離為 半徑)
 - 或者圓心與四個頂點的任意一個的距離小于等于半徑
 
0 ms 6 MB
更優美的解:Ikaruga大佬
bool checkOverlap(int radius, int x_center, int y_center, int x1, int y1, int x2, int y2) {double x0 = (x1 + x2) / 2.0;double y0 = (y1 + y2) / 2.0;vector<double> p = { abs(x_center - x0) , abs(y_center - y0) };//圓心與矩形中心的坐標差vector<double> q = { x2 - x0, y2 - y0 };//矩形中心與一個頂點的坐標差double a1 = max(p[0] - q[0], 0.0);//在上述兩個矩形內的話,一個分量為0double a2 = max(p[1] - q[1], 0.0);//在四個圓角處,兩個量都不為0return sqrt(a1 * a1 + a2 * a2) <= radius; }4. LeetCode 5363. 做菜順序 hard
題目鏈接
一個廚師收集了他 n 道菜的滿意程度 satisfaction ,這個廚師做出每道菜的時間都是 1 單位時間。
一道菜的 「喜愛時間」系數定義為烹飪這道菜以及之前每道菜所花費的時間乘以這道菜的滿意程度,也就是 time[i]*satisfaction[i] 。
請你返回做完所有菜 「喜愛時間」總和的最大值為多少。
你可以按 任意 順序安排做菜的順序,你也可以選擇放棄做某些菜來獲得更大的總和。
示例 1: 輸入:satisfaction = [-1,-8,0,5,-9] 輸出:14 解釋:去掉第二道和最后一道菜,最大的喜愛時間系數和為 (-1*1 + 0*2 + 5*3 = 14) 。 每道菜都需要花費 1 單位時間完成。示例 2: 輸入:satisfaction = [4,3,2] 輸出:20 解釋:按照原來順序相反的時間做菜 (2*1 + 3*2 + 4*3 = 20)示例 3: 輸入:satisfaction = [-1,-4,-5] 輸出:0 解釋:大家都不喜歡這些菜,所以不做任何菜可以獲得最大的喜愛時間系數。示例 4: 輸入:satisfaction = [-2,5,-1,0,3,-3] 輸出:35提示: n == satisfaction.length 1 <= n <= 500 -10^3 <= satisfaction[i] <= 10^3解題:
- 參考 ikaruga大佬的解
 - 貪心,先降序排列,滿意度最高的,系數越大越好
 
4 ms 6.8 MB
- 參考 迷糊的康康DP解
 
44 ms 19.4 MB
總結
以上是生活随笔為你收集整理的LeetCode 第 23 场双周赛(970/2044,前47.5%)的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: LeetCode 129. 求根到叶子节
 - 下一篇: LeetCode 179. 最大数(自定