巧妙排序;及相伴一生分析
今日面試題:巧妙排序
排序只有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釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。
相關文章
- 相伴一生;及構造最大數分析
- 找陣列的波谷;及巧妙排序的分析陣列排序
- 逆序;及巧妙變換分析
- 巧妙變換;及可憐的小老鼠分析
- 子序列;及又見排序分析排序
- 又見排序;及陣列和分析排序陣列
- 讓咖啡與程式碼相伴
- 讓工作與(vue)音樂相伴Vue
- 經典氣泡排序的分析、優化及測試排序優化
- [java]插入排序及折半插入排序Java排序
- 【排序演算法動畫解】排序介紹及氣泡排序排序演算法動畫
- 快速排序及優化排序優化
- 巧妙的CSSCSS
- Java高階知識點:平行計算(外部排序) 及 死鎖分析Java排序
- 巧妙利用快速排序法的原理求一個陣列中的第10大元素排序陣列
- Flutter的一生Flutter
- 氣泡排序及優化排序優化
- 巧妙的煎餅
- 如何分析排序演算法排序演算法
- 聊聊Oracle排序分析函式Oracle排序函式
- 氣泡排序文法分析排序
- Shell排序複雜度分析排序複雜度
- JAVA 程式的一生Java
- 堆的基本操作及堆排序排序
- 二叉堆及堆排序排序
- Laravel - 選單遞迴及排序Laravel遞迴排序
- 回家路上 圖靈教育與你相伴(贈書活動)圖靈
- DRF之排序類原始碼分析排序原始碼
- PostgreSQL 從熊燦燦一個獲取固定字元的SQL 分析巧妙之處SQL字元
- 直覺不靠譜!使用移動應用分析的七個巧妙方法
- Java,傳奇的一生!Java
- Spring Bean 的一生SpringBean
- 歸併排序與快速排序的簡明實現及對比排序
- 氣泡排序及優化詳解排序優化
- python之排序操作及heapq模組Python排序
- 歸併排序詳解及應用排序
- 內部排序分類及穩定性排序
- Wireshark網路分析例項集錦2.1.2隱藏、刪除、重新排序及編輯列排序