LeetCode 第 19 场双周赛(231 / 1120,前20.6%)
文章目錄
- 1. 比賽結(jié)果
- 2. 題目
- LeetCode 5311. 將數(shù)字變成 0 的操作次數(shù) easy
- LeetCode 5312. 大小為 K 且平均值大于等于閾值的子數(shù)組數(shù)目 medium
- LeetCode 5313. 時(shí)鐘指針的夾角 medium
- LeetCode 5314. 跳躍游戲 IV hard
1. 比賽結(jié)果
做出來(lái)了1, 3, 4題,第2題結(jié)束后12分鐘做出來(lái)了。
全國(guó)排名:231/1120,20.6%;全球排名:772/3745,20.6%
2. 題目
LeetCode 5311. 將數(shù)字變成 0 的操作次數(shù) easy
題目鏈接
給你一個(gè)非負(fù)整數(shù) num ,請(qǐng)你返回將它變成 0 所需要的步數(shù)。 如果當(dāng)前數(shù)字是偶數(shù),你需要把它除以 2 ;否則,減去 1 。
來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/number-of-steps-to-reduce-a-number-to-zero
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
解答:
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 且平均值大于等于閾值的子數(shù)組數(shù)目 medium
題目鏈接
給你一個(gè)整數(shù)數(shù)組 arr 和兩個(gè)整數(shù) k 和 threshold 。
請(qǐng)你返回長(zhǎng)度為 k 且平均值大于等于 threshold 的子數(shù)組數(shù)目。
示例 1: 輸入:arr = [2,2,2,2,5,5,5,8], k = 3, threshold = 4 輸出:3 解釋:子數(shù)組 [2,5,5],[5,5,5] 和 [5,5,8] 的平均值分別為 4,5 和 6 。其他長(zhǎng)度為 3 的子數(shù)組的平均值都小于 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 個(gè)長(zhǎng)度為 3 的子數(shù)組平均值都大于 5 。注意平均值不是整數(shù)。示例 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來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/number-of-sub-arrays-of-size-k-and-average-greater-than-or-equal-to-threshold
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
解題:
一開(kāi)始看錯(cuò)題,子數(shù)組,我看成,可以隨意組合。。。
雙指針解題即可。
LeetCode 5313. 時(shí)鐘指針的夾角 medium
題目鏈接
給你兩個(gè)數(shù) hour 和 minutes 。請(qǐng)你返回在時(shí)鐘上,由給定時(shí)間的時(shí)針和分針組成的較小角的角度(60 單位制)。
提示: 1 <= hour <= 12 0 <= minutes <= 59 與標(biāo)準(zhǔn)答案誤差在 10^-5 以內(nèi)的結(jié)果都被視為正確結(jié)果。解題:
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
題目鏈接
給你一個(gè)整數(shù)數(shù)組 arr ,你一開(kāi)始在數(shù)組的第一個(gè)元素處(下標(biāo)為 0)。
每一步,你可以從下標(biāo) i 跳到下標(biāo):
- i + 1 滿足:i + 1 < arr.length
- i - 1 滿足:i - 1 >= 0
- j 滿足:arr[i] == arr[j] 且 i != j
請(qǐng)你返回到達(dá)數(shù)組最后一個(gè)元素的下標(biāo)處所需的 最少操作次數(shù) 。
注意:任何時(shí)候你都不能跳到數(shù)組外面。
示例 1: 輸入:arr = [100,-23,-23,404,100,23,23,23,3,404] 輸出:3 解釋:那你需要跳躍 3 次,下標(biāo)依次為 0 --> 4 --> 3 --> 9 。 下標(biāo) 9 為數(shù)組的最后一個(gè)元素的下標(biāo)。示例 2: 輸入:arr = [7] 輸出:0 解釋:一開(kāi)始就在最后一個(gè)元素處,所以你不需要跳躍。示例 3: 輸入:arr = [7,6,9,6,9,6,9,7] 輸出:1 解釋:你可以直接從下標(biāo) 0 處跳到下標(biāo) 7 處,也就是數(shù)組的最后一個(gè)元素處。示例 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, 廣度優(yōu)先搜索
開(kāi)始想著用動(dòng)態(tài)規(guī)劃,后來(lái)知道不是,是最短路徑問(wèn)題。
先超時(shí)一次(連續(xù)一樣的數(shù),可以只插入最后一個(gè)即可,)
超時(shí)代碼:
通過(guò)代碼: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];} };賽后優(yōu)化代碼如下:
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;//跳過(guò)一樣的else//只插入連續(xù)相同的一段的首尾,中間跳肯定不是最短距離{ 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)//插入最后一個(gè)位置,可能重復(fù)插入了,但是不影響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;} };總結(jié)
以上是生活随笔為你收集整理的LeetCode 第 19 场双周赛(231 / 1120,前20.6%)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 无监督学习概论
- 下一篇: LeetCode 143. 重排链表(链