1. 程式人生 > 其它 >LC_253場周賽_賽後總結

LC_253場周賽_賽後總結

A 5838.檢查字串是否為陣列字首

問題描述:

給定字串 s 和 字串陣列 word,請你檢查 word 的前 k 個拼接字串是否為 s。

解題:

  1. 先判斷 word 頭字串的頭個字元是否與 s 的頭個字元相等,若不等則直接返回false。

  2. 用StringBuffer ans 拼接 word 的字串,當 ans 的長度大於等於 s 的長度,不再拼接。

  3. 判斷兩者是否相等。

B 5839. 移除石子使總數最小

問題描述:

給定 n 堆石子piles 和 操作次數 k,每次操作:選出一堆石子(假設第 i 堆),移除 floor(piles[i] / 2)堆石子,floor 是向下取整。求移除 k 次的最小石子總數。

解題:

一開始我選擇貪心演算法,排序後從後往前減石子,但是由於石子堆的最大值可能會出現在當前下標之後,所以最終嘗試了優先佇列(大根堆),得以解決。

優先佇列的簡便宣告:PriorityQueue pq = new PriorityQueue(((o1, o2) -> o2 - o1));

C 5840. 使字串平衡的最小交換次數

問題描述:

字串只有 '[' 和 ']'兩種字元,求最小交換次數,使得字串平衡。(只要左右匹配即平衡)

解題:

使用棧:

  1. 遇到 '['則進棧;

  2. 遇到 ']'則判斷棧非空 且 棧頂是否為 '[',若都是則出棧;否之入棧']'。

  3. 記錄最終棧中的'['個數為cnt,則答案為 (cnt + 1) / 2;

D(賽中未解出) 5841. 找出到每個位置為止最長的有效障礙賽跑路線

問題描述:

簡單來說,找到每個下標的 LIS 的長度。

輸入:obstacles = [1,2,3,2]
輸出:[1,2,3,3]

解題:

題目所給陣列長度為1e5,也就是說必須在 O(nlogn) 的時間複雜度下完成。

  1. 容易想到利用二分查詢:把之前出現元素儲存在一個數組中,然後對其進行二分查詢,找到 upperBound(即小於等於當前元素的最大值)。

  2. 若找到,則為其最大長度 + 1;否之,為1。

反思:upperBound 沒寫好,賽中沒能較好處理這一點,若處理好了,想必得以解決。