日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 第 23 场双周赛(970/2044,前47.5%)

發布時間:2024/7/5 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 個組,將 113 按數位求和后這些組分別是: [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
class Solution { public:bool canConstruct(string s, int k) {if(s.size() < k)return false;int count[26] = {0};for(int i = 0; i < s.size(); ++i)count[s[i]-'a']++;int odd = 0;for(int i = 0; i < 26; ++i){if(count[i]%2 == 1)odd++;} return odd <= 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) ,它既在圓上也在矩形上(兩者都包括點落在邊界上的情況)。


解題:

  • 檢查圓心是否在綠色或者藍色的矩形內(原矩形為紅色,偏移距離為 半徑)
  • 或者圓心與四個頂點的任意一個的距離小于等于半徑
class Solution { public:bool checkOverlap(int r, int xc, int yc, int x1, int y1, int x2, int y2) {if(dis(xc,yc,x1,y1)<=r*r||dis(xc,yc,x1,y2)<=r*r||dis(xc,yc,x2,y1)<=r*r||dis(xc,yc,x2,y2)<=r*r)return true;if(x1<=xc && xc <= x2 && y1-r <= yc && yc <= y2+r)return true;if(x1-r<=xc && xc <= x2+r && y1 <= yc && yc <= y2)return true;return false;}double dis(int xc, int yc, int x, int y){return pow((xc-x),2)+pow((yc-y),2);} };

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大佬的解
  • 貪心,先降序排列,滿意度最高的,系數越大越好
class Solution { public:int maxSatisfaction(vector<int>& satisfaction) {sort(satisfaction.rbegin(), satisfaction.rend());int sum = 0, ans = 0;for(int i = 0; i < satisfaction.size(); ++i){sum += satisfaction[i];//滿意度大的加上if(sum <= 0)break;ans += sum;//循環一次,最大的多加1次,相當于系數+1}return ans;} };

4 ms 6.8 MB

  • 參考 迷糊的康康DP解
class Solution { public:int maxSatisfaction(vector<int>& satisfaction) {sort(satisfaction.begin(), satisfaction.end());//需要先排序int i, j, n = satisfaction.size();vector<vector<int>> dp(n+1, vector<int>(n+1,0));//dp[i][j] 表示前i道菜,做j道的最大滿意度dp[1][0] = 0, dp[1][1] = satisfaction[0];for(i = 2; i <= n; ++i){for(j = 1; j <= i; ++j){if(j == i)dp[i][j] = dp[i-1][j-1]+j*satisfaction[i-1];//每道菜都做了elsedp[i][j] = max(dp[i-1][j], dp[i-1][j-1]+j*satisfaction[i-1]);//第i道菜不做,dp[i-1][j],第i道菜做 dp[i-1][j-1]+j*satisfaction[i-1]}}int ans = INT_MIN;for(i = 0; i <= n; ++i)ans = max(ans, dp[n][i]);//n道菜,做i道的最大值return ans;} };

44 ms 19.4 MB

總結

以上是生活随笔為你收集整理的LeetCode 第 23 场双周赛(970/2044,前47.5%)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。