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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

LeetCode 第 22 场双周赛(220/2041,前10.8%)

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

文章目錄

    • 1. 比賽結果
    • 2. 題目
      • LeetCode 5348. 兩個數組間的距離值 easy
      • LeetCode 5349. 安排電影院座位 medium
      • LeetCode 5350. 將整數按權重排序 medium
      • LeetCode 5351. 3n 塊披薩 hard

1. 比賽結果

做出來了前3題,第4題有點難,感覺是動態規劃。

全國排名:220 / 2041,10.8%;全球排名:729 / 5630,12.9%

2. 題目

LeetCode 5348. 兩個數組間的距離值 easy

題目鏈接

給你兩個整數數組 arr1 , arr2 和一個整數 d ,請你返回兩個數組之間的 距離值 。

「距離值」 定義為符合此描述的元素數目:對于元素 arr1[i] ,不存在任何元素 arr2[j] 滿足 |arr1[i]-arr2[j]| <= d 。

示例 1: 輸入:arr1 = [4,5,8], arr2 = [10,9,1,8], d = 2 輸出:2 解釋: 對于 arr1[0]=4 我們有: |4-10|=6 > d=2 |4-9|=5 > d=2 |4-1|=3 > d=2 |4-8|=4 > d=2 對于 arr1[1]=5 我們有: |5-10|=5 > d=2 |5-9|=4 > d=2 |5-1|=4 > d=2 |5-8|=3 > d=2 對于 arr1[2]=8 我們有: |8-10|=2 <= d=2 |8-9|=1 <= d=2 |8-1|=7 > d=2 |8-8|=0 <= d=2示例 2: 輸入:arr1 = [1,4,2,3], arr2 = [-4,-3,6,10,20,30], d = 3 輸出:2示例 3: 輸入:arr1 = [2,1,100,3], arr2 = [-5,-2,10,-3,7], d = 6 輸出:1提示: 1 <= arr1.length, arr2.length <= 500 -10^3 <= arr1[i], arr2[j] <= 10^3 0 <= d <= 100

解答:

  • 暴力查找即可
class Solution { public:int findTheDistanceValue(vector<int>& arr1, vector<int>& arr2, int d) {int i, j, count = 0;bool flag;for(i = 0; i < arr1.size(); i++) {flag = true;for(j = 0 ; j < arr2.size(); j++){if(abs(arr1[i]-arr2[j]) <= d){flag = false;break;}}if(flag)count++;}return count;} };

執行用時:8 ms
內存消耗:8.3 MB

LeetCode 5349. 安排電影院座位 medium

題目鏈接

如上圖所示,電影院的觀影廳中有 n 行座位,行編號從 1 到 n ,且每一行內總共有 10 個座位,列編號從 1 到 10 。

給你數組 reservedSeats ,包含所有已經被預約了的座位。比如說,researvedSeats[i]=[3,8] ,它表示第 3 行第 8 個座位被預約了。

請你返回 最多 能安排多少個 4 人家庭 。4 人家庭要占據 同一行內連續 的 4 個座位。隔著過道的座位(比方說 [3,3] 和 [3,4])不是連續的座位,但是如果你可以將 4 人家庭拆成過道兩邊各坐 2 人,這樣子是允許的。

示例 1:

輸入:n = 3, reservedSeats = [[1,2],[1,3],[1,8],[2,6],[3,1],[3,10]] 輸出:4 解釋:上圖所示是最優的安排方案,總共可以安排 4 個家庭。 藍色的叉表示被預約的座位,橙色的連續座位表示一個 4 人家庭。示例 2: 輸入:n = 2, reservedSeats = [[2,1],[1,8],[2,6]] 輸出:2示例 3: 輸入:n = 4, reservedSeats = [[4,3],[1,4],[4,6],[1,7]] 輸出:4提示: 1 <= n <= 10^9 1 <= reservedSeats.length <= min(10*n, 10^4) reservedSeats[i].length == 2 1 <= reservedSeats[i][0] <= n 1 <= reservedSeats[i][1] <= 10 所有 reservedSeats[i] 都是互不相同的。

解題:

  • 超時做法,先按排,排序,然后按排,統計一排的情況,做出判斷,判斷n排
  • 缺點,n 非常大,會超時
class Solution { //超時代碼 public:int maxNumberOfFamilies(int n, vector<vector<int>>& Seats) {int count = 0, line = 1, i = 0;sort(Seats.begin(), Seats.end(),[&](auto a, auto b){if(a[0] != b[0])return a[0] < b[0];return a[1] < b[1];});for(line = 1; line <= n; ++line){ bitset<11> b;while(i < Seats.size() && Seats[i][0] == line){b.set(Seats[i][1], 1);i++;}if(b.count() == 0 || (!b[2]&&!b[3]&&!b[4]&&!b[5]&&!b[6]&&!b[7]&&!b[8]&&!b[9]))count += 2;else if((!b[2]&&!b[3]&&!b[4]&&!b[5]) && (b[6]||b[7]||b[8]||b[9]))count += 1;else if((!b[6]&&!b[7]&&!b[8]&&!b[9]) && (b[2]||b[3]||b[4]||b[5]))count += 1;else if((!b[4]&&!b[5]&&!b[6]&&!b[7])&& (b[2]||b[3]) && (b[8]||b[9]))count += 1;}return count;} };
  • 采用 map + bitset 存儲 座位情況
  • 遍歷 所有的 bitset ,分類討論即可
  • 跳過沒有座位坐人的排,直接 +2
class Solution { public:int maxNumberOfFamilies(int n, vector<vector<int>>& Seats) {int count = 0, line = 1, i = 0;map<int,bitset<11>> m;//牌號,座位分布for(auto& st : Seats){m[st[0]].set(st[1]);}bitset<11> b;for(auto& mi : m)//遍歷座位分布,m的size表示有人坐的排{ b = mi.second;if(!b[2]&&!b[3]&&!b[4]&&!b[5]&&!b[6]&&!b[7]&&!b[8]&&!b[9])count += 2;else if((!b[2]&&!b[3]&&!b[4]&&!b[5]) && (b[6]||b[7]||b[8]||b[9]))count += 1;else if((!b[6]&&!b[7]&&!b[8]&&!b[9]) && (b[2]||b[3]||b[4]||b[5]))count += 1;else if((!b[4]&&!b[5]&&!b[6]&&!b[7]) && (b[2]||b[3]) && (b[8]||b[9]))count += 1;}return count+2*(n-m.size());//沒有人坐的,可以有2個家庭} };

執行用時:180 ms
內存消耗:42.3 MB

LeetCode 5350. 將整數按權重排序 medium

題目鏈接

我們將整數 x 的 權重 定義為按照下述規則將 x 變成 1 所需要的步數:

  • 如果 x 是偶數,那么 x = x / 2
  • 如果 x 是奇數,那么 x = 3 * x + 1
    比方說,x=3 的權重為 7 。因為 3 需要 7 步變成 1 (3 --> 10 --> 5 --> 16 --> 8 --> 4 --> 2 --> 1)。

給你三個整數 lo, hi 和 k 。你的任務是將區間 [lo, hi] 之間的整數按照它們的權重 升序排序 ,如果大于等于 2 個整數有 相同 的權重,那么按照數字自身的數值 升序排序 。

請你返回區間 [lo, hi] 之間的整數按權重排序后的第 k 個數。

注意,題目保證對于任意整數 x (lo <= x <= hi) ,它變成 1 所需要的步數是一個 32 位有符號整數。

示例 1: 輸入:lo = 12, hi = 15, k = 2 輸出:13 解釋:12 的權重為 912 --> 6 --> 3 --> 10 --> 5 --> 16 --> 8 --> 4 --> 2 --> 113 的權重為 9 14 的權重為 17 15 的權重為 17 區間內的數按權重排序以后的結果為 [12,13,14,15] 。對于 k = 2 ,答案是第二個整數也就是 13 。 注意,1213 有相同的權重,所以我們按照它們本身升序排序。1415 同理。示例 2: 輸入:lo = 1, hi = 1, k = 1 輸出:1示例 3: 輸入:lo = 7, hi = 11, k = 4 輸出:7 解釋:區間內整數 [7, 8, 9, 10, 11] 對應的權重為 [16, 3, 19, 6, 14] 。 按權重排序后得到的結果為 [8, 10, 11, 7, 9] 。 排序后數組中第 4 個數字為 7 。示例 4: 輸入:lo = 10, hi = 20, k = 5 輸出:13示例 5: 輸入:lo = 1, hi = 1000, k = 777 輸出:570提示: 1 <= lo <= hi <= 1000 1 <= k <= hi - lo + 1

解題:

  • lambda 表達式自定義排序即可
class Solution { public:int getKth(int lo, int hi, int k) {vector<int> v(hi-lo+1);int j = 0;for(int i = lo; i <= hi; i++)v[j++] = i;sort(v.begin(), v.end(),[&](int a, int b) {int wa = calw(a), wb = calw(b);if(wa == wb)return a < b;return wa < wb;});return v[k-1];}int calw(int x){int count = 0;while(x != 1){if(x%2)x = 3*x+1;elsex = x/2;count++;}return count;} };

執行用時:236 ms
內存消耗:8.8 MB

LeetCode 5351. 3n 塊披薩 hard

題目鏈接

給你一個披薩,它由 3n 塊不同大小的部分組成,現在你和你的朋友們需要按照如下規則來分披薩:

  • 你挑選 任意 一塊披薩。
  • Alice 將會挑選你所選擇的披薩逆時針方向的下一塊披薩。
  • Bob 將會挑選你所選擇的披薩順時針方向的下一塊披薩。
  • 重復上述過程直到沒有披薩剩下。

每一塊披薩的大小按順時針方向由循環數組 slices 表示。

請你返回你可以獲得的披薩大小總和的最大值

示例 1:

輸入:slices = [1,2,3,4,5,6] 輸出:10 解釋:選擇大小為 4 的披薩,Alice 和 Bob 分別挑選大小為 35 的披薩。 然后你選擇大小為 6 的披薩,Alice 和 Bob 分別挑選大小為 21 的披薩。 你獲得的披薩總大小為 4 + 6 = 10

示例 2:

輸入:slices = [8,9,8,6,1,1] 輸出:16 解釋:兩輪都選大小為 8 的披薩。如果你選擇大小為 9 的披薩,你的朋友們就會選擇大小為 8 的披薩,這種情況下你的總和不是最大的。示例 3: 輸入:slices = [4,1,2,5,8,3,1,9,7] 輸出:21示例 4: 輸入:slices = [3,1,2] 輸出:3提示: 1 <= slices.length <= 500 slices.length % 3 == 0 1 <= slices[i] <= 1000

解題:

  • 參考此處
class Solution { public:int maxSizeSlices(vector<int>& slices) {int i, j, n = slices.size()/3, k = slices.size();int prev_max = 0;vector<vector<int>> dp1(n,vector<int>(k,0));vector<vector<int>> dp2(n,vector<int>(k,0));dp1[0] = slices;dp2[0] = slices;for(i = 1; i < n; ++i){prev_max = 0;for(j = 0; j < k-1; ++j)//取第一塊的情況,最后一個取不到,k-1{if(j-2 >= 0)//取第一塊的情況prev_max = max(prev_max, dp1[i-1][j-2]);dp1[i][j] = prev_max + slices[j];}prev_max = 0;for(j = 1; j < k; ++j)//不取第一塊的情況,從1開始{if(j-2 >= 1)//不取第一塊的情況prev_max = max(prev_max, dp2[i-1][j-2]);dp2[i][j] = prev_max + slices[j];}}return max(*max_element(dp1[n-1].begin(),dp1[n-1].end()), *max_element(dp2[n-1].begin(),dp2[n-1].end()));} };

總結

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

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