考量到只有O(N)能過,可以直接想greedy。
嘗試由左到右遍歷會發現如果一個數字出現第二次,第二次的位子一定比較好。
有兩種情況:
一、遍歷範圍沒滿k,換新的必定讓範圍更小
二、遍歷範圍滿k,更小的一定發生在右遍的新區段,因此換新的才不會舊的擋在左邊
確定這個方法之後,可以用two pointer維護左端點,cnt>1就更新,邊找出最短距離即可。
O(T*N)
my code : https://ideone.com/PMhdek