日期 2024/06/02
LeetCode 週賽網站變得不穩定,介面跳了兩次。
這次做了前三題題目,最後一題沒想出來,根據討論區的解法,比想像中簡單很多。
該解題達人在 LinkedIn 有創立解題與面試社團,順手就加入該社團。
這題是 Blind 75 中 Interval 題型。
剛開始我是想用 stack 保存位址與字元使用,後來改為使用 priority_queue
。自訂結構體 struct foo
,保存字元與位址。
*
,就要將目前最小數值的字元從字串移除,複數個相同字元則移除距離最近的字元。因此需要自訂排序,對照 cmp
函式。priority_queue
元素全部取出,並以位址從小到大排序,對照 cmp2
函式。第四題題目定義非常簡單,我剛開始的想法為應用位元操作,使得每個子陣列的 AND 結果計算時間複雜度降為 ,最終整體時間複雜度為 ,但實際上沒有這種作法。
這是第一次就能想到的程式碼,但是在 LeetCode 最後幾個測資會超時。
參考討論區解答,使用 Dynamic Programming 剪枝不必要的計算,時間複雜度為
之前學 DP 都是避免重複計算與保留狀態,這裡我是第一次見到可以用來剪枝不必要的運算。
作者表示:
dp[j]
stores the maximum bitwise and of a subarray that ends at index j)dp[j]
最終數值即為 nums[j]
k - val >= ret || val <= dp[j]
當作 break
條件,因為當 k >= val
且 k - val >= ret
,表示接下來的 val
數值只會越小且 |k - val|
會更大