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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

LeetCode 第 20 场双周赛(294 / 1541,前19.07%,第1次全部通过)

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

文章目錄

    • 1. 比賽結果
    • 2. 題目
      • LeetCode 5323. 根據數字二進制下 1 的數目排序 easy
      • LeetCode 5324. 每隔 n 個顧客打折 medium
      • LeetCode 5325. 包含所有三種字符的子字符串數目 medium
      • LeetCode 5326. 有效的快遞序列數目 hard

1. 比賽結果

第一次全部做出來了,提前6分鐘結束戰斗,激動啊,今晚睡得著嗎?哈哈

全國排名:294/1541,前19.07%;全球排名:885/4347,前20.4%

  • 第4題,忘記取模%,錯誤一次(有點冤。。。)
  • 第2題有點失誤(錯了3次),花費時間過長,還用了本地IDE調試了幾次
    做題順序如下:


2. 題目

LeetCode 5323. 根據數字二進制下 1 的數目排序 easy

題目鏈接
給你一個整數數組 arr 。請你將數組中的元素按照其二進制表示中數字 1 的數目升序排序。

如果存在多個數字二進制中 1 的數目相同,則必須將它們按照數值大小升序排列。

請你返回排序后的數組。

示例 1: 輸入:arr = [0,1,2,3,4,5,6,7,8] 輸出:[0,1,2,4,8,3,5,6,7] 解釋:[0] 是唯一一個有 01 的數。 [1,2,4,8] 都有 11[3,5,6]21[7]31 。 按照 1 的個數排序得到的結果數組為 [0,1,2,4,8,3,5,6,7]示例 2: 輸入:arr = [1024,512,256,128,64,32,16,8,4,2,1] 輸出:[1,2,4,8,16,32,64,128,256,512,1024] 解釋:數組中所有整數二進制下都只有 11 ,所以你需要按照數值大小將它們排序。示例 3: 輸入:arr = [10000,10000] 輸出:[10000,10000]示例 4: 輸入:arr = [2,3,5,7,11,13,17,19] 輸出:[2,3,5,17,7,11,13,19]示例 5: 輸入:arr = [10,100,1000,10000] 輸出:[10,100,10000,1000]提示: 1 <= arr.length <= 500 0 <= arr[i] <= 10^4

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/sort-integers-by-the-number-of-1-bits
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。


解答:

  • 自定義排序,用的 lambda 表示式
int count(int n) {int c = 0;while(n)//計算n的二進制1的個數{c++;n = n&(n-1);}return c; } class Solution { public:vector<int> sortByBits(vector<int>& arr) {sort(arr.begin(), arr.end(),[](auto& a, auto& b) {if(count(a) == count(b))return a < b;return count(a) < count(b);});return arr;} };

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

LeetCode 5324. 每隔 n 個顧客打折 medium

題目鏈接
超市里正在舉行打折活動,每隔 n 個顧客會得到 discount 的折扣。

超市里有一些商品,第 i 種商品為 products[i] 且每件單品的價格為 prices[i] 。

結賬系統會統計顧客的數目,每隔 n 個顧客結賬時,該顧客的賬單都會打折,折扣為 discount (也就是如果原本賬單為 x ,那么實際金額會變成 x - (discount * x) / 100 ),然后系統會重新開始計數。

顧客會購買一些商品, product[i] 是顧客購買的第 i 種商品, amount[i] 是對應的購買該種商品的數目。

請你實現 Cashier 類:

  • Cashier(int n, int discount, int[] products, int[] prices) 初始化實例對象,參數分別為打折頻率 n ,折扣大小 discount ,超市里的商品列表 products 和它們的價格 prices 。
  • double getBill(int[] product, int[] amount) 返回賬單的實際金額(如果有打折,請返回打折后的結果)。返回結果與標準答案誤差在 10-5 以內都視為正確結果。
示例 1: 輸入 ["Cashier","getBill","getBill","getBill","getBill","getBill","getBill","getBill"] [[3,50,[1,2,3,4,5,6,7],[100,200,300,400,300,200,100]],[[1,2],[1,2]],[[3,7],[10,10]],[[1,2,3,4,5,6,7],[1,1,1,1,1,1,1]],[[4],[10]],[[7,3],[10,10]],[[7,5,3,1,6,4,2],[10,10,10,9,9,9,7]],[[2,3,5],[5,3,2]]] 輸出 [null,500.0,4000.0,800.0,4000.0,4000.0,7350.0,2500.0] 解釋 Cashier cashier = new Cashier(3,50,[1,2,3,4,5,6,7],[100,200,300,400,300,200,100]); cashier.getBill([1,2],[1,2]); // 返回 500.0, 賬單金額為 = 1 * 100 + 2 * 200 = 500. cashier.getBill([3,7],[10,10]); // 返回 4000.0 cashier.getBill([1,2,3,4,5,6,7],[1,1,1,1,1,1,1]); // 返回 800.0 ,賬單原本為 1600.0 ,但由于該顧客是第三位顧客, 他將得到 50% 的折扣,所以實際金額為 1600 - 1600 * (50 / 100) = 800 。 cashier.getBill([4],[10]); // 返回 4000.0 cashier.getBill([7,3],[10,10]); // 返回 4000.0 cashier.getBill([7,5,3,1,6,4,2],[10,10,10,9,9,9,7]); // 返回 7350.0 ,賬單原本為 14700.0 , 但由于系統計數再次達到三,該顧客將得到 50% 的折扣,實際金額為 7350.0 。 cashier.getBill([2,3,5],[5,3,2]); // 返回 2500.0提示: 1 <= n <= 10^4 0 <= discount <= 100 1 <= products.length <= 200 1 <= products[i] <= 200 products 列表中 不會 有重復的元素。 prices.length == products.length 1 <= prices[i] <= 1000 1 <= product.length <= products.length product[i] 在 products 出現過。 amount.length == product.length 1 <= amount[i] <= 1000 最多有 1000 次對 getBill 函數的調用。 返回結果與標準答案誤差在 10^-5 以內都視為正確結果。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/apply-discount-every-n-orders
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。


解題:

  • 注意使用哈希表查找product[i]在products里的下標
class Cashier {int num;int disc;vector<int> pric;unordered_map<int,int> idx;int people = 0;int i;double money; public:Cashier(int n, int discount, vector<int>& products, vector<int>& prices) {num = n;disc = discount;pric = prices;for(i = 0; i < products.size();++i){idx.insert(make_pair(products[i],i));}}double getBill(vector<int> product, vector<int> amount) {money = 0;for(i = 0; i < product.size(); i++){money += pric[idx[product[i]]]*amount[i];}people++;if(people == num){people = 0;money = money*(100-disc)/100;}return money;} };

執行用時:228 ms
內存消耗:119.9 MB

LeetCode 5325. 包含所有三種字符的子字符串數目 medium

題目鏈接

給你一個字符串 s ,它只包含三種字符 a, b 和 c 。

請你返回 a,b 和 c 都 至少 出現過一次的子字符串數目。(相同字符串算多次)

示例 1: 輸入:s = "abcabc" 輸出:10 解釋:包含 a,b 和 c 各至少一次的子字符串為 "abc", "abca", "abcab", "abcabc", "bca", "bcab", "bcabc", "cab", "cabc""abc" (相同字符串算多次)。示例 2: 輸入:s = "aaacb" 輸出:3 解釋:包含 a,b 和 c 各至少一次的子字符串為 "aaacb", "aacb""acb" 。示例 3: 輸入:s = "abc" 輸出:1提示: 3 <= s.length <= 5 x 10^4 s 只包含字符 a,b 和 c 。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/number-of-substrings-containing-all-three-characters
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。


解題:

  • 先順序記錄下所有的 a,b,c 的位置,存儲于 pa,pb,pc
  • 然后遍歷 pa,pb,pc 分別以a開頭,b開頭,c開頭查找,開始的下標start是知道的
  • 然后在另外兩個數組里二分查找,第一個比start大的下標
  • 如果都存在另外兩個下標比start大,那么可有的子串數就是 s.size()-最大的下標
class Solution {vector<int> pa;vector<int> pb;vector<int> pc; public:int numberOfSubstrings(string s) {int i,x,y;for(i = 0; i < s.size(); i++){ //記錄abc的下標if(s[i] == 'a')pa.push_back(i);else if(s[i] == 'b')pb.push_back(i);elsepc.push_back(i);}if(pa.empty() || pb.empty() || pc.empty())return 0;int count = 0;for(auto& idxa : pa){x = bsfirst(idxa,pb);//二分查找第一個大于idxa的下標y = bsfirst(idxa,pc);if(x==-1 || y==-1)continue;//有一個字符沒有找到,沒有符合的子串count += s.size()-max(pb[x],pc[y]);}for(auto& idxb : pb){x = bsfirst(idxb,pa);y = bsfirst(idxb,pc);if(x==-1 || y==-1)continue;count += s.size()-max(pa[x],pc[y]);}for(auto& idxc : pc){x = bsfirst(idxc,pb);y = bsfirst(idxc,pa);if(x==-1 || y==-1)continue;count += s.size()-max(pb[x],pa[y]);}return count;}int bsfirst(int idx, vector<int>& v){ //二分查找,第一個比idx大的數int l = 0, r = v.size()-1, mid;while(l <= r){mid = l+((r-l)>>1);if(v[mid] < idx)l = mid+1;else if(v[mid] > idx){if(mid == 0 || v[mid-1] < idx)return mid;elser = mid-1;}}return -1;} };

執行用時:76 ms
內存消耗:17.3 MB

LeetCode 5326. 有效的快遞序列數目 hard

題目鏈接

給你 n 筆訂單,每筆訂單都需要快遞服務。

請你統計所有有效的 收件/配送 序列的數目,確保第 i 個物品的配送服務 delivery(i) 總是在其收件服務 pickup(i) 之后。

由于答案可能很大,請返回答案對 10^9 + 7 取余的結果。

示例 1: 輸入:n = 1 輸出:1 解釋:只有一種序列 (P1, D1),物品 1 的配送服務(D1)在物品 1 的收件服務(P1)后。示例 2: 輸入:n = 2 輸出:6 解釋:所有可能的序列包括: (P1,P2,D1,D2)(P1,P2,D2,D1)(P1,D1,P2,D2)(P2,P1,D1,D2)(P2,P1,D2,D1)(P2,D2,P1,D1)(P1,D2,P2,D1) 是一個無效的序列,因為物品 2 的收件服務(P2)不應在物品 2 的配送服務(D2)之后。示例 3: 輸入:n = 3 輸出:90提示: 1 <= n <= 500

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/count-all-valid-pickup-and-delivery-options
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。


解題:

  • 動態規劃問題
  • dp[i] 表示 i 件物品可能的投遞次序數
  • 在 dp[i-1] 的基礎上,考慮兩端,他有一共有 2?(i?1)+1=2i?12*(i-1)+1 = 2i-12?(i?1)+1=2i?1 個空位
  • 第 i 個包裹分開投遞,那么插空有 C2i?12=(2i?1)(2i?2)/2=(2i?1)(i?1)C_{2i-1}^2 = (2i-1)(2i-2)/2=(2i-1)(i-1)C2i?12?=(2i?1)(2i?2)/2=(2i?1)(i?1) 種可能
  • 第 i 個包裹不分開,連續1投1遞,那么插空有 2i?12i-12i?1種可能
  • 兩種情況相加*乘以之前的種類即可:
    dp[i]=dp[i?1]?[(2?i?1)?(i?1)+2?i?1]=dp[i?1]?(2?i?1)?idp[i] = dp[i-1]*[(2*i-1)*(i-1)+2*i-1]=dp[i-1]*(2*i-1)*idp[i]=dp[i?1]?[(2?i?1)?(i?1)+2?i?1]=dp[i?1]?(2?i?1)?i
class Solution { public:int countOrders(int n) {vector<long> dp(n+1,0);dp[1] = 1;for(int i = 2; i <= n; ++i){dp[i] = dp[i-1]*(2*i-1)*i%1000000007;}return dp[n];} };

執行用時:0 ms
內存消耗:8.6 MB

總結

以上是生活随笔為你收集整理的LeetCode 第 20 场双周赛(294 / 1541,前19.07%,第1次全部通过)的全部內容,希望文章能夠幫你解決所遇到的問題。

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