七夕鵲橋;及數字遊戲分析

紫鳳發表於2013-08-19

今日面試題:七夕鵲橋

有n對喜鵲。每一對可以表示為(x,y),x、y是喜鵲的編號,並且任意一對,x總是小於y。(c,d)可以連線在(a,b)之後,當且僅當b

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

數字遊戲分析

原題

盒子中有n張卡片,上面的數字分別為k1,k2,...,kn。你有4次機會,每抽一次,記錄下卡片上的數字,再將卡片放回盒子中。如果4個數字的和等於m。則你就贏得遊戲,否則就是輸。直覺上,贏的可能性太低了。請你給出程式,判斷是否有贏的可能性。儘量提高方法的效率。

分析

這個題目,和之前Google的一個概率的題目是類似的,當然解決的方法也是類似的,思路大家可以找找前面的題目,不再贅述。

這個題目其實想和大家講一下思考問題、改進解法的思路。

這個題目最直接的方法就是四重迴圈遍歷,n^4的時間複雜度,比較恐怖,但確實一個很好的起點。不用覺得很丟人,只要我們持續改進即可。

假設a,b,c是k1到kn中的三個數字,是否存在d使得,a+b+c+d=m?d在k1到kn中。和題目中的意思是一樣的,變換等式如下:

d = m - a - b - c

如果滿足上式,就是說,要在k1到k2中查詢d,即:查詢m - a - b - c,找到就存在;找不到,就是不存在。查詢有線性查詢,二分查詢等。四重迴圈最內一層迴圈,可以認為是線性的查詢,如果想更快一些,可以應用二分查詢,而二分查詢需要k1到kn是排序的,則先對n個數字進行排序,時間複雜度O(nlogn)。然後最內一層迴圈,改為二分查詢,時間複雜度為O(n^3logn)。所以總的時間複雜度為O(n^3logn)。

經過上面的分析,我們可以得到啟發,既然可以提出一個d,那麼就可以再提出一個c。將a+b+c+d=m轉換為c+d=m-a-b。這樣,我們可以列舉k1到kn的兩個數的和,然後對n2個和,進行排序,時間複雜度為o(n^2logn)。然後遍歷n^2個和,設每一個和為pair,查詢是否存在m-pair,同樣二分查詢,時間複雜度為O(n^2logn)。總的時間複雜度為O(n^2logn)。

經過上面的層層分析,大家能否發現,對於演算法的持續改進,還是有一些竅門的,大家細心領悟。領悟得多了,必會有更大的進步。

這個題目其實解法比較多,出了上面介紹的,還有別的方法,比如應用一些資料結構。大家可以開動自己的腦筋,不斷的發散。不要為了完成一個題目而去思考。應該嘗試不同的思路,即使思路的時間、空間的複雜度並不好,但是隻要能夠分析清楚。這就是很大的進步。這些也是我們給大家介紹面試題的一個初衷。我們儘可能的將問題分析透徹,希望能夠給大家以啟迪。

【分析完畢】

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

相關文章