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] 是唯一一個有 0 個 1 的數。 [1,2,4,8] 都有 1 個 1 。 [3,5,6] 有 2 個 1 。 [7] 有 3 個 1 。 按照 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] 解釋:數組中所有整數二進制下都只有 1 個 1 ,所以你需要按照數值大小將它們排序。示例 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 表示式
執行用時: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 以內都視為正確結果。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/apply-discount-every-n-orders
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
解題:
- 注意使用哈希表查找product[i]在products里的下標
執行用時: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()-最大的下標
執行用時: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
執行用時:0 ms
內存消耗:8.6 MB
總結
以上是生活随笔為你收集整理的LeetCode 第 20 场双周赛(294 / 1541,前19.07%,第1次全部通过)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 1023. 驼峰式匹配
- 下一篇: LeetCode 881. 救生艇(贪心