LeetCode 第 30 场双周赛(477/2545,前18.7%,第2次全部通过)
文章目錄
- 1. 比賽結果
- 2. 題目
- 1. LeetCode 5177. 轉變日期格式 easy
- 2. LeetCode 5445. 子數組和排序后的區間和 medium
- 3. LeetCode 5446. 三次操作后最大值與最小值的最小差 medium
- 4. LeetCode 5447. 石子游戲 IV hard(博弈DP)
1. 比賽結果
時隔近5個月,第二次全過,第一次全過是第20場雙周賽。
第二次全部做出來了,可能題目簡單點!第一題沒有補零,錯誤一發,第二題,不必排序,錯誤一發,繼續加油!
全國排名: 477 / 2545,18.7%;全球排名: 1292 / 8175,15.8%
2. 題目
1. LeetCode 5177. 轉變日期格式 easy
題目鏈接
給你一個字符串 date ,它的格式為 Day Month Year ,其中:
- Day 是集合 {"1st", "2nd", "3rd", "4th", ..., "30th", "31st"} 中的一個元素。
- Month 是集合 {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"} 中的一個元素。
- Year 的范圍在 ?[1900, 2100] 之間。
請你將字符串轉變為 YYYY-MM-DD 的格式,其中:
YYYY 表示 4 位的年份。
MM 表示 2 位的月份。
DD 表示 2 位的天數。
解題:
- 注意不足2位的,要補0
2. LeetCode 5445. 子數組和排序后的區間和 medium
題目鏈接
給你一個數組 nums ,它包含 n 個正整數。你需要計算所有非空連續子數組的和,并將它們按升序排序,得到一個新的包含 n * (n + 1) / 2 個數字的數組。
請你返回在新數組中下標為 left 到 right (下標從 1 開始)的所有數字和(包括左右端點)。由于答案可能很大,請你將它對 10^9 + 7 取模后返回。
示例 1: 輸入:nums = [1,2,3,4], n = 4, left = 1, right = 5 輸出:13 解釋:所有的子數組和為 1, 3, 6, 10, 2, 5, 9, 3, 7, 4 。 將它們升序排序后,我們得到新的數組 [1, 2, 3, 3, 4, 5, 6, 7, 9, 10] 。 下標從 le = 1 到 ri = 5 的和為 1 + 2 + 3 + 3 + 4 = 13 。示例 2: 輸入:nums = [1,2,3,4], n = 4, left = 3, right = 4 輸出:6 解釋:給定數組與示例 1 一樣, 所以新數組為 [1, 2, 3, 3, 4, 5, 6, 7, 9, 10] 。 下標從 le = 3 到 ri = 4 的和為 3 + 3 = 6 。示例 3: 輸入:nums = [1,2,3,4], n = 4, left = 1, right = 10 輸出:50提示: 1 <= nums.length <= 10^3 nums.length == n 1 <= nums[i] <= 100 1 <= left <= right <= n * (n + 1) / 2解題:
- 計算以每個數字 nums[i] 為開始的子數組前綴和,插入multiset
- 最后取出對應區間的即可
3. LeetCode 5446. 三次操作后最大值與最小值的最小差 medium
題目鏈接
給你一個數組 nums ,每次操作你可以選擇 nums 中的任意一個數字并將它改成任意值。
請你返回三次操作后, nums 中最大值與最小值的差的最小值。
示例 1: 輸入:nums = [5,3,2,4] 輸出:0 解釋:將數組 [5,3,2,4] 變成 [2,2,2,2]. 最大值與最小值的差為 2-2 = 0 。示例 2: 輸入:nums = [1,5,0,10,14] 輸出:1 解釋:將數組 [1,5,0,10,14] 變成 [1,1,0,1,1] 。 最大值與最小值的差為 1-0 = 1 。示例 3: 輸入:nums = [6,6,0,1,1,4,6] 輸出:2示例 4: 輸入:nums = [1,5,6,14,15] 輸出:1提示: 1 <= nums.length <= 10^5 -10^9 <= nums[i] <= 10^9解題:
- 排序后,前后總共去掉3個,4種情況取最小
4. LeetCode 5447. 石子游戲 IV hard(博弈DP)
題目鏈接
Alice 和 Bob 兩個人輪流玩一個游戲,Alice 先手。
一開始,有 n 個石子堆在一起。每個人輪流操作,正在操作的玩家可以從石子堆里拿走 任意 非零 平方數 個石子。
如果石子堆里沒有石子了,則無法操作的玩家輸掉游戲。
給你正整數 n ,且已知兩個人都采取最優策略。
如果 Alice 會贏得比賽,那么返回 True ,否則返回 False 。
類似題目:
LeetCode 1025. 除數博弈(動態規劃)
LeetCode 810. 黑板異或游戲(博弈推理)
解題:
class Solution { public:bool winnerSquareGame(int n) {vector<bool> dp(n+1, false);int i, j;for(i = 0; i <= n; ++i)//遍歷石子的樣本維度{for(j = 1; j*j+i <= n; ++j){ //拿走 j^2 個石子if(!dp[i])//如果只有 i 個石頭的時候輸dp[j*j+i] = true;//那么有j*j+i個石頭時,就贏了}}return dp[n];} };我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
總結
以上是生活随笔為你收集整理的LeetCode 第 30 场双周赛(477/2545,前18.7%,第2次全部通过)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 1243. 数组变换
- 下一篇: LeetCode 441. 排列硬币(数