找數字;及最長等差數列分析
今日面試題:找數字
陣列A中,除了某一個數字x之外,其他數字都出現了三次,而x出現了一次。請給出最快的方法,找到x。
======================================================
最長等差數列分析
原題
給定未排序的陣列,請給出方法找到最長的等差數列。
分析
題目描述比較簡單,但是有一個問題我們需要首先搞清楚:等差數列中的數字,是否要和原始陣列中的順序一致。題目中,並沒有說明,這個就需要大家在面試的過程中和麵試官進行交流。我們在這裡對兩種情況都進行討論
保證數字的順序
等差數列是要求相鄰兩個元素之間的差是相同的。那我們可以記錄下來陣列中任意兩個數的差,並且記錄下來。對於陣列A,記錄A[j]-A[i],其中 i
-1=>(0,1)(1,2)
1=>(2,3)(4,5)
3=>(3,4)
上面已經排好序,對於第一個,找到等差數列0,1,2對應數字誒5,4,3.第二個,3和4位置沒有連起來,不夠成等差數列。方法平均時間複雜度為O(n^2),空間複雜度為O(n^2).
無需保證數字的順序
不需要保證數字的順序與原來陣列一致,如何找到最長的等差數列呢?原來的陣列是無序的,我們先對陣列進行排序,最終的一定是排序之後序列的子序列。然後,我們採用動態規劃的方法解決這個問題。我們假設dp[i][j]表示以A[i]A[j]開始的數列的長度,dp[i][j]如何表示呢?dp[i][j]=dp[j][k]+1,當 A[j]-A[i]=A[k]-A[j],及A[k]+A[i]=2*A[j]。根據dp[i][j]的定義,我們知道dp[x][n-1]=2,也就是 最後一列是2,數列只有A[x]和A[n-1]兩個元素。首先,j從n-2,開始向前遍歷,對於每一個,找到i和k,滿足 A[k]+A[i]=2*A[j],則有dp[i][j]=dp[j][k]+1,若沒有,則dp[i][j]就為2.
這裡找i和k,有一個小技巧,如下:初始i=j-1,k=j+1,然後分別向兩邊遍歷,如果A[k]+A[i]2*A[j]則i--。大家還是參考程式碼吧:
【分析完畢】
本文來自微信:待字閨中,2013-09-07釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。
相關文章
- 最長等差數列;及子序列分析
- 缺失的數字;及找數字分析
- 找數字續;及缺失的數字分析
- 括號匹配;及找數字續分析
- 周長最長;及找到最大數分析
- javascript 生成簡單等差數列JavaScript
- 重排陣列;及消失的數字分析陣列
- 18:等差數列末項計算
- 【題解】A23329.等差數列計數
- 找最大數;及序列生成分析
- C++等差數列(數論、歐幾里得輾轉相除gcd)C++GC
- 翻譯數字串;及最長迴文子串分析字串
- 東華 OJ 一維陣列競賽 等差數列陣列
- 線段樹維護區間等差數列
- Trick:處理加減等差數列的技巧
- 格點數目;及兄弟數字分析
- 繩子的長度;及找陣列的波谷分析陣列
- 【.Net】從字串陣列中尋找數字的元素字串陣列
- 兄弟數字;及修理柵欄分析
- 數字陣列最值,總和,平均,中位數 未完待續陣列
- 2017年藍橋杯javaB組——等差素數列Java
- 數字遊戲;及螞蟻螞蟻分析遊戲
- P3901 數列找不同
- 用Python解決一個等差數列的求和問題Python
- 七夕鵲橋;及數字遊戲分析遊戲
- 查詢陣列中出現次數大於陣列長度一半的數字陣列
- 找陣列的波谷;及巧妙排序的分析陣列排序
- 第十屆藍橋杯省賽C++B組 等差數列C++
- 螞蟻螞蟻;及周長最長分析
- 數字之魅:尋找陣列中的最大值和最小值陣列
- BZOJ 3357 [Usaco2004]等差數列:map優化dp優化
- LeetCode:尋找丟失的數字LeetCode
- 找一個陣列中特別的數陣列
- 找最小的k個數(優先佇列)佇列
- 消失的數字;及格點數目分析
- excel表格數字怎麼變成正常數字 數字太長後面變成000Excel
- 最長公共子序列求方案數
- Python 英文的月份轉數字及數字轉英文Python