標籤:

Zenefits電面真題 & 解析

專欄 | 九章演算法

網址 | http://www.jiuzhang.com

2015年10日22日剛面的zenefits電面題:

一堆商品,買一個可以送一個,但送的那個的價格必須小於買的那個的價格(強調一下,不能等於)。給定商品總數n和每個商品的價格,求得到全部商品的最少開銷。 例如:4個商品價格為[5, 4, 3, 3],最優解為9,即買5和4,送3和3。 兩個test case: [100, 99, 98, 1, 1, 1], [100, 99, 98, 98, 97, 97, 97, 97]

更多面試真題,請訪問九章官網QA版塊。

解 答

令狐沖,九章演算法班主講老師

這個題確實是很難的動態規劃。屬於區間型動態規劃。在九章演算法強化班中會講到這個類型的動態規劃。

首先排序不用說了。從小到大(從大到小也可以,我比較喜歡從小到大)。然後先給出DP的方程:

定義狀態 f[i][j] 為 i 到 j 這一段的最優值(最少花多少錢全買下來)nf[i][j] = min(f[i + 1][j - 1]+A[j], f[i][k] + f[k+1][j]) 其中k為i到j-1。n

然後我們來證明為什麼這個方程是對的。這個方程的假設前提是,不存在相交的搭配,也就是說不存在下面這種情況的匹配:

從小到大的4個數:a<= b<= c<= d。 a與c一起買,b與d一起買。n

為毛呢?首先a和d肯定不相等,否則的話,abcd都相等了,這種情況是不會出現的(我們就是要證明這種情況不會出現),然後看b和c,如果他們相等,那麼換成(a,b)和(c,d),代價一樣,並且不會產生相交的匹配(什麼叫做相交?你在ac連一條曲線,和bd之間的曲線一定相交)。然後看b和c不等的情況,不等的話,換成(b,c) + (a,d),也還是不影響結果=c+d, 然後又能使得連線不相交。

好了,上面我們證明了不相交理論。那麼既然連線不想交的話,i-j這一段的匹配情況,只存在兩種可能性:

  • 第一種可能是i和j匹配,然後中間的自己配對。

  • 第二種可能是,一定存在一條分割線,使得這個i-j的區間被分為i-k和k+1-j,兩個區間之間的自己匹配,沒有互相的連邊。

好了,綜上所述。問題已經解決並證明。我知道理解起來有點難,特別是證明,我也證明了好久……

順便說一下時間複雜度 : O(n^3),可能可以用決策單調的優化優化到O(n^2)。

你可能要問我,我TMD是怎麼想到這個解法的呢?因為課上講過的DP就那麼幾種大類型……面試99%都落在 「劃分/區間/矩陣/雙序列/背包" 這五種類型。一個個試試看就行了……首先想到的是劃分,然後發現推導不出來。然後矩陣肯定不是,雙序列和背包也不是,只剩下區間了……

歡迎關注我的微信公眾號:九章演算法(ninechapter)。

精英程序員交流社區,定期發布面試題、面試技巧、求職信息等。

aHR0cDovL3dlaXhpbi5xcS5jb20vci9zVVBsLVlURVM5azByY0NlOXhhag== (二維碼自動識別)

推薦閱讀:

最全Google面試準備寶典 | 面試流程、考察範圍、如何準備...
當我們談論面試時,我們在談論什麼
顏值對面試會有影響嗎?
OpenDoc - 面試官行為規範
如何做好面試——單面and群面

TAG:面试 |