合併總數;及相差最大分析

紫鳳發表於2013-08-12

今日面試題

求正數陣列內和為指定數字的合併總數

例如:[5, 5, 10, 2, 3] 合併值為 15

合併總數為4,分別為:(5 + 10, 5 + 10, 5 + 5 + 2 + 3, 10 + 2 + 3)

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

相差最大分析

原題

給定無序陣列A,線上性時間內找到i和j,j>i,並且保證A[j]-A[i]是最大的。

分析

這個題目是比較簡單的。很直接的,對於每一個A[j],如果知道前面的元素中最小的元素min,則此時相差最大為A[j]-min。則,假設有一個陣列M,M[j]表示[0,j-1]中最小的元素。這個遍歷一邊A,就可以完成構造M。再遍歷一邊陣列,就可以找到相差最大的。我們舉個例子看看M,以及是否有改進的空間。

假設A={1,2,5,3,4}。通過一次遍歷,得到M如下:

1 1 1 1 1

這是一個極端的例子,但確實給了我們一個改進的方向,就是並不需要一個陣列儲存最小值,而只需要一個變數即可。

上面的例子不明顯,假定A={2,5,1,3,4},過程如下:

j A[j] 最小值m A[j]-m
0 2 2 0
1 5 2 3
2 1 1 0
3 3 1 2
4 4 1 3

最終得到相差最大為3.這個例子,可以找到兩個i,j。

上面的過程是一個不斷改進的一個過程。如果在面試的過程中,能夠很好的完成,即使在面試官的指導之下,也是沒有問題的。

這個題目,如果有的同學給出陣列C,C[j]表示[0,j]中的最小值;陣列B表示[j+1, n-1]中的最大值;這兩個陣列遍歷兩次可以得到,然後,再遍歷一次A,對於每一個i,B[i]-C[i]中最大的,就是最終的值。這個思路也是ok的,只不過比我們開始提到的,更加一些,可以通過觀察C,B的變化,找到規律,進行化簡。

【分析完畢】

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

相關文章