LC_253場周賽_賽後總結
A 5838.檢查字串是否為陣列字首
問題描述:
給定字串 s 和 字串陣列 word,請你檢查 word 的前 k 個拼接字串是否為 s。
解題:
-
先判斷 word 頭字串的頭個字元是否與 s 的頭個字元相等,若不等則直接返回false。
-
用StringBuffer ans 拼接 word 的字串,當 ans 的長度大於等於 s 的長度,不再拼接。
-
判斷兩者是否相等。
B 5839. 移除石子使總數最小
問題描述:
給定 n 堆石子piles 和 操作次數 k,每次操作:選出一堆石子(假設第 i 堆),移除 floor(piles[i] / 2)堆石子,floor 是向下取整。求移除 k 次的最小石子總數。
解題:
一開始我選擇貪心演算法,排序後從後往前減石子,但是由於石子堆的最大值可能會出現在當前下標之後,所以最終嘗試了優先佇列(大根堆),得以解決。
優先佇列的簡便宣告:PriorityQueue
C 5840. 使字串平衡的最小交換次數
問題描述:
字串只有 '[' 和 ']'兩種字元,求最小交換次數,使得字串平衡。(只要左右匹配即平衡)
解題:
使用棧:
-
遇到 '['則進棧;
-
遇到 ']'則判斷棧非空 且 棧頂是否為 '[',若都是則出棧;否之入棧']'。
-
記錄最終棧中的'['個數為cnt,則答案為 (cnt + 1) / 2;
D(賽中未解出) 5841. 找出到每個位置為止最長的有效障礙賽跑路線
問題描述:
簡單來說,找到每個下標的 LIS 的長度。
輸入:obstacles = [1,2,3,2]
輸出:[1,2,3,3]
解題:
題目所給陣列長度為1e5,也就是說必須在 O(nlogn) 的時間複雜度下完成。
-
容易想到利用二分查詢:把之前出現元素儲存在一個數組中,然後對其進行二分查詢,找到 upperBound(即小於等於當前元素的最大值)。
-
若找到,則為其最大長度 + 1;否之,為1。
反思:upperBound 沒寫好,賽中沒能較好處理這一點,若處理好了,想必得以解決。