如果 asecond_min−min(a)≤min(a),此時這個策略計算出的 k 值會在與策略 1 (min(a)) 的比較中被取代,故實作時不用特別檢查 x>min(a) 這個條件。
結論
綜合上述兩種情況,答案即為 max(min(a),second_min(a)−min(a))。
複雜度分析
時間複雜度:O(n) 或 O(nlogn),找出最小和次小值即可。
空間複雜度:O(n) 用於存儲輸入,可優化至 O(1)。
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
from heapq import nsmallest
defsolve(): n = int(input()) A = list(map(int, input().split())) assertlen(A) == n
# 找出陣列中最小的兩個元素 # nsmallest 可以在 O(n) 時間內找到最小的 k 個元素 a, b = nsmallest(2, A) # 策略 1: 目標變為 0,此時 max_k = a # 策略 2: 目標變為 a,此時 max_k = b - a (需滿足 b - a > a,否則無效,但會直接被 max 覆蓋) print(max(a, b - a))
if __name__ == "__main__": t = int(input()) for _ inrange(t): solve()