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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

LeetCode 第 19 场双周赛(231 / 1120,前20.6%)

發布時間:2024/7/5 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 。

示例 1: 輸入:num = 14 輸出:6 解釋: 步驟 1) 14 是偶數,除以 2 得到 7 。 步驟 27 是奇數,減 1 得到 6 。 步驟 36 是偶數,除以 2 得到 3 。 步驟 43 是奇數,減 1 得到 2 。 步驟 52 是偶數,除以 2 得到 1 。 步驟 61 是奇數,減 1 得到 0 。示例 2: 輸入:num = 8 輸出:4 解釋: 步驟 18 是偶數,除以 2 得到 4 。 步驟 24 是偶數,除以 2 得到 2 。 步驟 32 是偶數,除以 2 得到 1 。 步驟 41 是奇數,減 1 得到 0 。示例 3: 輸入:num = 123 輸出:12提示: 0 <= num <= 10^6

來源:力扣(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] 的平均值分別為 456 。其他長度為 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
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。


解題:

一開始看錯題,子數組,我看成,可以隨意組合。。。
雙指針解題即可。

class Solution { public:int numOfSubarrays(vector<int>& arr, int k, int threshold) {int i = 0, j = k-1, n = arr.size(), sum=0, target = k*threshold;int count = 0;for(i = 0; i < k; i++) sum += arr[i];if(sum >= target)count++;i=1,j++;while(j < n){sum += arr[j]-arr[i-1];if(sum >= target)count++;i++,j++;}return count;} };

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, 廣度優先搜索

開始想著用動態規劃,后來知道不是,是最短路徑問題。
先超時一次(連續一樣的數,可以只插入最后一個即可,)

超時代碼:

class Solution { public:int minJumps(vector<int>& arr) {if(arr.size() == 1)return 0;int i, tp;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 = 1; i < n; i++)m.insert(make_pair(arr[i], i));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];} };

通過代碼: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%)的全部內容,希望文章能夠幫你解決所遇到的問題。

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