1. 程式人生 > >uva 1608 不無聊的序列(附帶常用算法設計和優化策略總結)

uva 1608 不無聊的序列(附帶常用算法設計和優化策略總結)

設計 cnblogs 高效 基於 復雜 時間復雜度 出現一次 去除 算法設計

uva 1608 不無聊的序列(附帶常用算法設計和優化策略總結)

紫書上有這樣一道題:

如果一個序列的任意連續子序列中都至少有一個只出現一次的元素,則稱這個序列時不無聊的。輸入一個n個元素的序列,判斷它是不是無聊的序列。n<=200000。

首先,在整個序列中找到只出現一次的元素ai。如果不能找到,那它就是無聊的。不然,就可以退出當前循環,遞歸判斷[1, i-1]和[i+1, n]是不是無聊的序列。然而怎麽找ai很重要。如果從一頭開始找,那麽最差情況下的時間復雜度就是O(n^2)的。而如果從兩頭開始找,那麽最差情況就變成了ai在中間,時間復雜度是O(nlogn)!這是因為在中間的找起來慢,分起來快,而在兩端的找起來快,分起來慢。有些時候用好中途相遇法還是很重要的!

下面是紫書上講的常用算法設計策略和優化策略(註意這裏是設計策略而不是算法):

構造法(構造解),

中途相遇法(通常比多個相遇法還要優秀),

問題分解(將兩個不相關的問題剝離開來分別求解),

等價轉換(化繁為簡),

假設法(利用對稱性避免討論),

使用數據結構(在不改變主算法的情況下加速算法),

數形結合(通常與滑動窗口相聯系),

二分答案(將求最優值轉化為判定最優值,也算在策略內),

掃描法(帶有順序的枚舉法,通常維護一些重要的量),

枚舉基準(尋找基於當前基準的最優值,再取所有基準的最值),

滑動窗口(維護單調性,高效去除冗余狀態)等等。

uva 1608 不無聊的序列(附帶常用算法設計和優化策略總結)