問題:n 個城市位於數軸上,坐標遞增。對每個城市,求到其他城市的最小和最大距離。
解法:城市已排序。第 i 個城市:
最小距離 = min(x[i] - x[i-1], x[i+1] - x[i])(邊界特判)
最大距離 = max(x[i] - x[0], x[n-1] - x[i])
時間 O(n),單次掃描即可。
問題:給定進出記錄(+id 進入,-id 離開),初始和最終可能有人在館內。求最小可能容量。
解法:用集合模擬當前在館內的人。遇到 -id 但 id 不在集合中,說明此人初始就在館內,容量下限 +1。答案為過程中集合大小與初始人數之和的最大值。
set st; int ans = 0;
for each event:
if '+': st.insert(id);
else: if (!st.count(id)) ++ans; else st.erase(id);
ans = max(ans, (int)st.size());
問題:給定序列 a 和公比 k,求嚴格遞增下標三元組 (i, j, k) 使 a[j] = a[i]·k, a[k] = a[j]·k。
解法:遍歷序列,維護兩個哈希表:
first[x] = 值為 x 作為首項的出現次數
second[x] = 值為 x 作為第二項的合法三元組前綴數
對當前值 v:若 v % k == 0,答案增加 second[v/k];更新 second[v] += first[v/k];first[v]++。
特判 k = 1 時避免重複計數。時間 O(n)。
問題:長度 n 線段放 k 艘長度 a 的船(不相鄰)。給定 m 次射擊位置,求最早第幾次射擊必定擊中船。
解法:用有序集合維護已射擊位置(含邊界 0 和 n+1)。初始最大可放船數 = ⌊n/(a+1)⌋(首尾特判)。每次插入射擊點 x,找其左右相鄰已射擊點 l, r,更新可放船數:
減去原區間貢獻 (r-l)/(a+1),加上左右新區間貢獻。若可放船數 < k,輸出當前步數。
時間 O(m log m)。