巧妙排序;及相伴一生分析

紫鳳發表於2013-07-25

今日面試題:巧妙排序

排序只有1,2,3三個元素的陣列,不能統計1,2,3的個數。

希望大家能夠相出多多的思路。比如,最小的空間,最少的次數。

===================

相伴一生分析:

原題

給定一個陣列,陣列中只包含0和1。請找到一個最長的子序列,其中0和1的數量是相同的。

例1:10101010 結果就是其本身。

例2:1101000 結果是110100

請大家展開自己的思路。

分析

這個題目,看起來比較簡單,一些同學可能認為題目的描述符合動態規劃的特徵,然後就開始用動態規劃解,努力找狀態轉移方程。這些同學的感覺,是很正確的。但,找狀態轉移方程,我們要對原來的陣列進行變換一下。

原來是0和1的串,我們將0都換為-1。這樣題目目標就變成,找到一個最長的子串,子串數字和是0。設原陣列為A, DP[i]表示從0開始到i的子陣列和。DP遍歷一遍陣列即可。例1中的陣列產生的DP為:

0 1 2 3 4 5 6 7
1 0 1 0 1 0 1 0

這個例子,最後一個值是0,並且長度是偶數位。直接滿足了結果。

再看例子2:

0 1 2 3 4 5 6
1 2 1 2 1 0 -1

5的位置為0,最長子串從0開始到5,長度為6。

上面這兩個例子,所求的子串都是從頭開始,如果不是從頭開始,會是什麼樣的呢?看這個例子:1101100

0 1 2 3 4 5 6
1 2 1 2 3 2 1

通過觀察上面的表格,我們可以得到,DP[0]==DP[6]==DP[2],DP[1]==DP[3]. 根據DP的定義,如果DP[i]==DP[j],i 一種方法,我們用map儲存DP的值到位置的對映,如下表:

DP值 位置 最大位置 最小位置 最大長度
1 0,2,6 6 0 6
2 1,3 3 1 2
3 4 4 4 0
最長子串長度 6

我們最終的演算法,要綜合考慮最長串是否從頭開始的。 上面的這個思路,時間複雜度是O(n),空間複雜度也是O(n).

還有其他的思路,例如DP儲存的是[0,i]的1的個數,那麼DP[j] - DP[i] * 2 == j - i則表明A[i+1]...A[j]是一個滿足條件的串,找到j-i最大的,就是最終的結果,這個思路的時間複雜度為O(n^2),空間複雜度為O(n).

【分析完畢】

本文來自微信:待字閨中,2013-07-21釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。

相關文章