LeetCode 第 19 场双周赛(231 / 1120,前20.6%)
文章目錄
- 1. 比賽結果
- 2. 題目
- LeetCode 5311. 將數字變成 0 的操作次數 easy
- LeetCode 5312. 大小為 K 且平均值大于等于閾值的子數組數目 medium
- LeetCode 5313. 時鐘指針的夾角 medium
- LeetCode 5314. 跳躍游戲 IV hard
1. 比賽結果
做出來了1, 3, 4題,第2題結束后12分鐘做出來了。
全國排名:231/1120,20.6%;全球排名:772/3745,20.6%
2. 題目
LeetCode 5311. 將數字變成 0 的操作次數 easy
題目鏈接
給你一個非負整數 num ,請你返回將它變成 0 所需要的步數。 如果當前數字是偶數,你需要把它除以 2 ;否則,減去 1 。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/number-of-steps-to-reduce-a-number-to-zero
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
解答:
class Solution { public:int numberOfSteps (int num) {int count = 0;while(num){ if(num%2 == 0)num /= 2;elsenum -= 1;count++;}return count;} };LeetCode 5312. 大小為 K 且平均值大于等于閾值的子數組數目 medium
題目鏈接
給你一個整數數組 arr 和兩個整數 k 和 threshold 。
請你返回長度為 k 且平均值大于等于 threshold 的子數組數目。
示例 1: 輸入:arr = [2,2,2,2,5,5,5,8], k = 3, threshold = 4 輸出:3 解釋:子數組 [2,5,5],[5,5,5] 和 [5,5,8] 的平均值分別為 4,5 和 6 。其他長度為 3 的子數組的平均值都小于 4 (threshold 的值)。示例 2: 輸入:arr = [1,1,1,1,1], k = 1, threshold = 0 輸出:5示例 3: 輸入:arr = [11,13,17,23,29,31,7,5,2,3], k = 3, threshold = 5 輸出:6 解釋:前 6 個長度為 3 的子數組平均值都大于 5 。注意平均值不是整數。示例 4: 輸入:arr = [7,7,7,7,7,7,7], k = 7, threshold = 7 輸出:1示例 5: 輸入:arr = [4,4,4,4], k = 4, threshold = 1 輸出:1提示: 1 <= arr.length <= 10^5 1 <= arr[i] <= 10^4 1 <= k <= arr.length 0 <= threshold <= 10^4來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/number-of-sub-arrays-of-size-k-and-average-greater-than-or-equal-to-threshold
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
解題:
一開始看錯題,子數組,我看成,可以隨意組合。。。
雙指針解題即可。
LeetCode 5313. 時鐘指針的夾角 medium
題目鏈接
給你兩個數 hour 和 minutes 。請你返回在時鐘上,由給定時間的時針和分針組成的較小角的角度(60 單位制)。
提示: 1 <= hour <= 12 0 <= minutes <= 59 與標準答案誤差在 10^-5 以內的結果都被視為正確結果。解題:
class Solution { public:double angleClock(int hour, int minutes) {double d1 = 0, d2 = 0;d2 = minutes*6;d1 = (hour%12)*30 + double(d2)/360*30;return min(abs(d1-d2),360-abs(d1-d2));} };LeetCode 5314. 跳躍游戲 IV hard
題目鏈接
給你一個整數數組 arr ,你一開始在數組的第一個元素處(下標為 0)。
每一步,你可以從下標 i 跳到下標:
- i + 1 滿足:i + 1 < arr.length
- i - 1 滿足:i - 1 >= 0
- j 滿足:arr[i] == arr[j] 且 i != j
請你返回到達數組最后一個元素的下標處所需的 最少操作次數 。
注意:任何時候你都不能跳到數組外面。
示例 1: 輸入:arr = [100,-23,-23,404,100,23,23,23,3,404] 輸出:3 解釋:那你需要跳躍 3 次,下標依次為 0 --> 4 --> 3 --> 9 。 下標 9 為數組的最后一個元素的下標。示例 2: 輸入:arr = [7] 輸出:0 解釋:一開始就在最后一個元素處,所以你不需要跳躍。示例 3: 輸入:arr = [7,6,9,6,9,6,9,7] 輸出:1 解釋:你可以直接從下標 0 處跳到下標 7 處,也就是數組的最后一個元素處。示例 4: 輸入:arr = [6,1,9] 輸出:2示例 5: 輸入:arr = [11,22,7,7,7,7,7,7,7,22,13] 輸出:3提示: 1 <= arr.length <= 5 * 10^4 -10^8 <= arr[i] <= 10^8解題:
- BFS, 廣度優先搜索
開始想著用動態規劃,后來知道不是,是最短路徑問題。
先超時一次(連續一樣的數,可以只插入最后一個即可,)
超時代碼:
通過代碼:172ms
class Solution { public:int minJumps(vector<int>& arr) {if(arr.size() == 1)return 0;int i, tp, prev = arr[0];const int n = arr.size();vector<int> dp(n, INT_MAX);queue<int> q;vector<bool> visited(n,false);q.push(0);visited[0] = true;dp[0] = 0;multimap<int, int> m;for(i = 0; i < n; i++){if(arr[i] == prev)continue;else{m.insert(make_pair(prev, i-1));prev = arr[i];}}m.insert(make_pair(arr[n-1],n-1));while(!q.empty() && (dp[n-1] == INT_MAX)){tp = q.front();q.pop();if(tp+1 < n && !visited[tp+1]){dp[tp+1] = min(dp[tp+1], 1+dp[tp]);q.push(tp+1);visited[tp+1] = true;}if(tp-1>0 && !visited[tp-1]){dp[tp-1] = min(dp[tp-1], 1+dp[tp]);q.push(tp-1);visited[tp-1] = true;}if(dp[n-1] != INT_MAX)return dp[n-1];auto start = m.equal_range(arr[tp]).first, end = m.equal_range(arr[tp]).second;for(auto it = start; it != end; ++it){if(!visited[it->second]){visited[it->second] = true;dp[it->second] = min(dp[it->second], 1+dp[tp]);q.push(it->second);}if(dp[n-1] != INT_MAX)return dp[n-1];}}return dp[n-1];} };賽后優化代碼如下:
class Solution { public:int minJumps(vector<int>& arr) {if(arr.size() == 1)return 0;int i, tp, prev = INT_MIN, step = 0, size;const int n = arr.size();queue<int> q;vector<bool> visited(n,false);q.push(0);visited[0] = true;multimap<int, int> m;for(i = 0; i < n; i++){if(arr[i] == prev)continue;//跳過一樣的else//只插入連續相同的一段的首尾,中間跳肯定不是最短距離{ if(i-1>=0)m.insert(make_pair(arr[i-1],i-1));m.insert(make_pair(arr[i], i));prev = arr[i];}if(i == n-1)//插入最后一個位置,可能重復插入了,但是不影響m.insert(make_pair(arr[i],i));}while(!q.empty()){size = q.size();while(size--){tp = q.front();q.pop();if(tp == n-1)return step;// 跳往i+1位置if(tp+1 < n && !visited[tp+1]){q.push(tp+1);visited[tp+1] = true;}// 跳往i-1位置if(tp-1>0 && !visited[tp-1]){q.push(tp-1);visited[tp-1] = true;}// 跳往值相同的位置auto start = m.equal_range(arr[tp]).first, end = m.equal_range(arr[tp]).second;for(auto it = start; it != end; ++it){if(!visited[it->second]){visited[it->second] = true;q.push(it->second);}}}step++;}return step;} };總結
以上是生活随笔為你收集整理的LeetCode 第 19 场双周赛(231 / 1120,前20.6%)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无监督学习概论
- 下一篇: LeetCode 143. 重排链表(链