Leetcode 1663 - Smallest String With A Given Numeric Value

題目

Problem#

題目給你兩個數字 nk 問你: 由 n 個字母組成,所有字母加起來總和為 k 且字串字典序最小
a=1, b=2, …, z=26

想法#

最優的答案是後面都是 z 前面都是 a,先貪心找最後的 z 長度: 對於字串 Z = aa...z = 1*(a長度) + 26 假如 k 大於 Z 的話,則最後一定可以擺一個 z,亦即 k >= 1*(n-1) + 26
接下來就都擺 a ,中間的字母(夾在 az 中間 e.g. “aa…x…zz”),就擺 'a'+(k-1)

Read More

Leetcode 2212 - Maximum Points in an Archery Competition

題目

Problem#

有 Alice 和 Bob 比賽射箭,每個人有 numArrows 支箭 ,一人各射 12 局,規則是: 如果第 $i$ 局的分數比另一個人大,$A_i \ge B_i$ 則 A 得到 $i$ 分。
今天 Alice 先射完了,他的結果是 [aliceArrows_0, aliceArrows_11] ,問你 Bob 的結果長怎樣,他的得分才會是最大的

想法#

這題有兩種做法: 爆搜和 DP。
之所以可以爆搜是因為局數 只有 12 局,所以能在 $\mathcal{O}(2^12)$ 內做完,bitwise 枚舉也是一樣。DP 則是把箭數當重量、得分當價值的話,問題就變成了 0/1 背包 $\mathcal{O}(nm), n=\text{12}, m=10^5$

Read More

Leetcode 2211 - Count Collisions on a Road

題目

Problem#

一條路上有 $n$ 台車,每台車可以有三種方向: S, L, R 分別是靜止、左、右。今天每台車都朝其方向駛去,當相撞時車子留在原地,問你給定一個 directions 序列,有幾台車會撞車。

想法#

可以觀察到 RS, SL, RL 這三種狀況一定會撞到,但如果序列是 RRL 則最一開始的 R 不會算到,所以必須要記錄 R 的數量,當遇到前面三種撞車的狀況時,就將目前算到 `R 的數量也加到答案中(那些 R 的車也會撞到)

Read More

Leetcode 895 - Maximum Frequency Stack

題目

Problem#

題目要你實作一個像 stack 的資料結構,但與單純的 stack 不同的是: pop 是看當前元素個數最多的決定的,如果個數相同則越靠近 top 越先被 pop 出來,例如: [5,7,5,7,4,5] 則 pop 順序會是 [5,7,5,4,7,5]

想法#

用一個 heap 維護 (數字個數, 位置, 數字值) 的結構,另外還要維護一個 數字對到個數的結構,和當前的位置。

Read More