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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

LeetCode 第 207 场周赛(245/4115,前5.95%)

發布時間:2024/7/5 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 第 207 场周赛(245/4115,前5.95%) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 比賽結果
    • 2. 題目
      • 1. LeetCode 5519. 重新排列單詞間的空格 easy
      • 2. LeetCode 5520. 拆分字符串使唯一子字符串的數目最大 medium
      • 3. LeetCode 5521. 矩陣的最大非負積 medium
      • 4. LeetCode 5522. 連通兩組點的最小成本 hard

1. 比賽結果

做出來3題,第四題試了DP和貪心都沒過,狀態轉移可能沒找對。繼續加油!

全國排名: 245 / 4115,5.95%;全球排名: 774 / 12923,5.99%

2. 題目

1. LeetCode 5519. 重新排列單詞間的空格 easy

題目鏈接

給你一個字符串 text ,該字符串由若干被空格包圍的單詞組成。
每個單詞由一個或者多個小寫英文字母組成,并且兩個單詞之間至少存在一個空格。

題目測試用例保證 text 至少包含一個單詞

請你重新排列空格,使每對相鄰單詞之間的空格數目都 相等 ,并盡可能 最大化 該數目。
如果不能重新平均分配所有空格,請 將多余的空格放置在字符串末尾 ,這也意味著返回的字符串應當與原 text 字符串的長度相等。

返回 重新排列空格后的字符串 。

示例 1: 輸入:text = " this is a sentence " 輸出:"this is a sentence" 解釋:總共有 9 個空格和 4 個單詞。 可以將 9 個空格平均分配到相鄰單詞之間, 相鄰單詞間空格數為:9 / (4-1) = 3 個。示例 2: 輸入:text = " practice makes perfect" 輸出:"practice makes perfect " 解釋:總共有 7 個空格和 3 個單詞。 7 / (3-1) = 3 個空格加上 1 個多余的空格。 多余的空格需要放在字符串的末尾。示例 3: 輸入:text = "hello world" 輸出:"hello world"示例 4: 輸入:text = " walks udp package into bar a" 輸出:"walks udp package into bar a "示例 5: 輸入:text = "a" 輸出:"a"提示: 1 <= text.length <= 100 text 由小寫英文字母和 ' ' 組成 text 中至少包含一個單詞

解題:

  • 按題意模擬
class Solution { public:string reorderSpaces(string text) {int space = 0, word = 0, n = text.length();vector<string> w;string s;for(int i = 0; i < n; i++) {if(text[i] == ' ')space++;//空格計數else{s += text[i];//單詞if((i < n-1 && text[i+1] == ' ') || i == n-1){word++;//單詞計數w.push_back(s);s = "";}}}if(word == 1)return w[0]+string(space, ' ');int len = space/(word-1);int rest = space - len*(word-1);string ans;string empty(len,' ');for(int i = 0; i < w.size(); i++){ans += w[i];if(i < w.size()-1)ans += empty;}return ans+string(rest, ' ');} };

4 ms 6.1 MB

2. LeetCode 5520. 拆分字符串使唯一子字符串的數目最大 medium

題目鏈接

給你一個字符串 s ,請你拆分該字符串,并返回拆分后唯一子字符串的最大數目。

字符串 s 拆分后可以得到若干 非空子字符串 ,這些子字符串連接后應當能夠還原為原字符串。
但是拆分出來的每個子字符串都必須是 唯一的 。

注意:子字符串 是字符串中的一個連續字符序列。

示例 1: 輸入:s = "ababccc" 輸出:5 解釋:一種最大拆分方法為 ['a', 'b', 'ab', 'c', 'cc'] 。 像 ['a', 'b', 'a', 'b', 'c', 'cc'] 這樣拆分不滿足題目要求, 因為其中的 'a''b' 都出現了不止一次。示例 2: 輸入:s = "aba" 輸出:2 解釋:一種最大拆分方法為 ['a', 'ba'] 。示例 3: 輸入:s = "aa" 輸出:1 解釋:無法進一步拆分字符串。提示: 1 <= s.length <= 16 s 僅包含小寫英文字母

解題:

  • 看數據量很小,暴力回溯做的
class Solution {int maxs = 1;unordered_set<string> set; public:int maxUniqueSplit(string s) {dfs(s, 0);return maxs;} void dfs(string s, int count){if(s == ""){maxs = max(maxs, count);return;}int n = s.size();for(int len = 1; len <= n; ++len) {string tmp = s.substr(0, len);string rest = s.substr(len);if(set.find(tmp) == set.end())//不重復{set.insert(tmp);//記錄下來dfs(rest, count+1);set.erase(tmp);//回溯}}} };

556 ms 42.1 MB

  • 加入剪枝,加速
class Solution {int maxs = 1;unordered_set<string> set; public:int maxUniqueSplit(string s) {dfs(s);return maxs;} void dfs(string s){if(s.size()+set.size() <= maxs)return;//剪枝,剩余的肯定不夠大if(s == ""){maxs = max(maxs, int(set.size()));return;}int n = s.size();for(int len = 1; len <= n; ++len) {string tmp = s.substr(0, len);string rest = s.substr(len);if(set.find(tmp) == set.end()){set.insert(tmp);dfs(rest);set.erase(tmp);}}} };

44 ms 8.7 MB

3. LeetCode 5521. 矩陣的最大非負積 medium

題目鏈接

給你一個大小為 rows x cols 的矩陣 grid 。
最初,你位于左上角 (0, 0) ,每一步,你可以在矩陣中 向右向下 移動。

在從左上角 (0, 0) 開始到右下角 (rows - 1, cols - 1) 結束的所有路徑中,找出具有 最大非負積 的路徑。
路徑的積是沿路徑訪問的單元格中所有整數的乘積。

返回 最大非負積 對 10^9 + 7 取余 的結果。
如果最大積為負數,則返回 -1 。

注意,取余是在得到最大積之后執行的。

示例 1: 輸入:grid = [[-1,-2,-3],[-2,-3,-3],[-3,-3,-2]] 輸出:-1 解釋:從 (0, 0)(2, 2) 的路徑中無法得到非負積,所以返回 -1示例 2: 輸入:grid = [[1,-2,1],[1,-2,1],[3,-4,1]] 輸出:8 解釋:最大非負積對應的路徑已經用粗體標出 (1 * 1 * -2 * -4 * 1 = 8)示例 3: 輸入:grid = [[1, 3],[0,-4]] 輸出:0 解釋:最大非負積對應的路徑已經用粗體標出 (1 * 0 * -4 = 0)示例 4: 輸入:grid = [[ 1, 4,4,0],[-2, 0,0,1],[ 1,-1,1,1]] 輸出:2 解釋:最大非負積對應的路徑已經用粗體標出 (1 * -2 * 1 * -1 * 1 * 1 = 2)提示: 1 <= rows, cols <= 15 -4 <= grid[i][j] <= 4

解題:

  • 動態規劃 dp[i][j] 存儲一個 pair,first 是最小值,second 是最大值
typedef long long ll; class Solution { public:int maxProductPath(vector<vector<int>>& grid) {int m = grid.size(), n = grid[0].size();vector<vector<pair<ll,ll>>> dp(m, vector<pair<ll,ll>>(n));dp[0][0].first = dp[0][0].second = grid[0][0];// first 存儲最小值,second 存儲最大值for(int i = 1; i < n; ++i) //初始化第一行,最大最小值都一樣{dp[0][i].first = dp[0][i].second = dp[0][i-1].second*grid[0][i];}for(int i = 1; i < m; ++i) //初始化第一列,最大最小值都一樣{dp[i][0].first = dp[i][0].second = dp[i-1][0].second*grid[i][0];}for(int i = 1; i < m; i++){for(int j = 1; j < n; j++){if(grid[i][j] >= 0){dp[i][j].first = min(dp[i-1][j].first, dp[i][j-1].first)*grid[i][j];dp[i][j].second = max(dp[i-1][j].second, dp[i][j-1].second)*grid[i][j];}else// if(grid[i][j] < 0){dp[i][j].second = min(dp[i-1][j].first, dp[i][j-1].first)*grid[i][j];dp[i][j].first = max(dp[i-1][j].second, dp[i][j-1].second)*grid[i][j];}}}if(dp[m-1][n-1].second < 0)return -1;return dp[m-1][n-1].second%(int(1e9+7));} };

8 ms 10.3 MB

4. LeetCode 5522. 連通兩組點的最小成本 hard

題目鏈接

給你兩組點,其中第一組中有 size1 個點,第二組中有 size2 個點,且 size1 >= size2 。

任意兩點間的連接成本 cost 由大小為 size1 x size2 矩陣給出,其中 cost[i][j] 是第一組中的點 i 和第二組中的點 j 的連接成本。
如果兩個組中的每個點都與另一組中的一個或多個點連接,則稱這兩組點是連通的。
換言之,第一組中的每個點必須至少與第二組中的一個點連接,
且第二組中的每個點必須至少與第一組中的一個點連接。

返回連通兩組點所需的最小成本

示例 1:

輸入:cost = [[15, 96], [36, 2]] 輸出:17 解釋:連通兩組點的最佳方法是: 1--A 2--B 總成本為 17

示例 2:

輸入:cost = [[1, 3, 5], [4, 1, 1], [1, 5, 3]] 輸出:4 解釋:連通兩組點的最佳方法是: 1--A 2--B 2--C 3--A 最小成本為 4 。 請注意,雖然有多個點連接到第一組中的點 2 和第二組中的點 A , 但由于題目并不限制連接點的數目,所以只需要關心最低總成本。示例 3: 輸入:cost = [[2, 5, 1], [3, 4, 7], [8, 1, 2], [6, 2, 4], [3, 8, 8]] 輸出:10提示: size1 == cost.length size2 == cost[i].length 1 <= size1, size2 <= 12 size1 >= size2 0 <= cost[i][j] <= 100

解題:

待學習。狀態壓縮DP


我的CSDN博客地址 https://michael.blog.csdn.net/

長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!

總結

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

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