原題連結
題解
\(O(n^3)\) 的暴力方法:
遍歷所有區間,然後找出每個區間內的最小值
\(O(n^2)\) 的暴力方法:
考慮每個點的貢獻,往左擴充套件直至出現比其小,往右擴充套件直至出現比其小的
觀察 \(O(n^2)\) 的暴力方法,我們發現往左擴充套件和往右擴充套件相互獨立
所以我們只觀察往左擴充套件
”往左擴充套件直至遇見比自己小的“ 這個不就是找到左邊第一個比自己小的這樣一個經典 的問題嗎?
如果一個選手年齡比你小還比你強,那你可以退役了,也就是說,我們不需要每次遍歷其左邊所有元素
考慮當前數需要遍歷的決策點,如果存在某個決策點,其左邊的數比自己大,那麼左邊這個數就是無用決策點,可以刪除
這樣一來,當前數需要考慮的決策點是一個從左往右下標遞增,數的大小遞增的序列
如果序列的末尾數比當前數大,那麼就刪除,因為不會對後面的答案產生貢獻,如果比自己小,那麼這個數就是當前數的左邊第一個比自己小的的數
然後把當前數插入決策點序列
這樣一來,時間複雜度就是 \(O(n)\)