k個最小和;及數對數目分析

紫鳳發表於2013-11-01

今日面試題:k個最小和

給定k個陣列,每個陣列有k個整數。每個陣列中選取一個整數,一共k個整數,取其和,一共可以得到k^k個和。給出方法,求得這k^k個和中,最小的k個。

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

數對數目分析原題給定兩個陣列X和Y,元素都是正數。請找出滿足如下條件的數對的數目:

1. x^y > y^x,即x的y次方>y的x次方

2. x來自X陣列,y來自Y陣列

分析

假設陣列X的長度為m,陣列Y的長度為n,最直接的暴力法,時間複雜度為O(m*n),但這樣的話,並不需要都是正數這個條件的。那麼,我們該如何優化呢?

x^y>y^x,對於x和y來講,有什麼規律呢?該如何發現呢?這裡其實有規律的,大多數的條件下,當y>x的時 候,x^y>y^x,但是有一些例外,1,2,3,4幾個數,需要特殊的考慮,比如2^4=4^2。這個大家可以通過在紙上寫寫畫畫來得到,相對繁 瑣,我們就不進一步分析了。

我們可否對於原式做一些數學變換呢?使得式子變化簡單。如何去做呢?這個式子的複雜體現在兩邊都是指數的形式,如何變化一下呢?我們很自然的就想 到,逆運算對數運算,則,兩邊取對數可得:ylog(x)>xlog(y)。這裡同學們可能要問,可以直接取對數麼?取對數之後,大小關係仍舊滿足 麼?這裡是有兩點保證的:

1. 對數函式的性質,單調遞增

2. 題目中的說明:元素都是正數

對於式子:ylog(x)>xlog(y),x和y都是正數,則進一步有:兩邊同時除以xy,則:log(x)/x >log(y)/y。這個式子,看起來也複雜,但是,x和y都在各自的一邊,要簡單的多。 對於log(x)/x >log(y)/y,

1. 陣列X和Y分別計算log(x)/x,log(y)/y

2. 然後對Y進行排序O(nlogn)

3. 遍歷X陣列,對於每一個x,在Y中,進行二分查詢,即可。

總的時間複雜度為O(nlogn + mlogn).

【分析完畢】

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

相關文章