如果我正確理解你的問題,你正在尋找具有最高比率A [j]/A [i]的數組中的兩個指數(i,j)。如果是這樣,那麼你可以將它減少到this related problem,它會要求你找到指數(i,j),使得A [j] - A [i]儘可能大。這個問題有一個非常快的O(n) - 時間,O(1) - 空間算法,可以適應這個問題。直覺就是解決由數組的第一個元素組成的數組,然後是前兩個元素,然後是前三個元素等的問題。一旦你解決了數組中前n個元素的問題,你有問題的全面解決方案。
讓我們考慮如何做到這一點。最初,當您考慮數組的第一個元素時,通過比較元素與其自身,可以得到的最佳百分比增量爲0%。現在,假設(歸納地)你已經解決了前k個數組元素的問題,並想知道當你看下一個數組元素時會發生什麼。發生這種情況時,兩個條件之一成立。首先,前k個元素的最大百分比增加也可能是第一個(k + 1)元素的最大百分比增加。例如,如果第(k + 1)個st數組元素是一個非常小的數字,那麼您很可能無法從前k個元素中的某個值增加到該值。其次,最大百分比增加可能是從前k個元素中的一個到第(k + 1)個st元素。如果是這種情況,則最高百分比增加將從最初的k個元素到第(k + 1)個元素。
結合這兩種情況,我們得到了最好的百分比增幅比前k + 1個元素是最大的
- 第k個元素的增加比例最高,或
- 增加的百分比從最小的第k個元素到第(k + 1)個st元素。
您可以通過遍歷數組元素遍歷數據元素來實現此操作,以跟蹤兩個值 - 您迄今爲止看到的最小值和最大化增加百分比的對。舉個例子,對於
1 2 3 10 1 20 40 60
你原來的例子陣列算法將這樣的工作:
1 2 3 10 1 20 40 60
min 1 1 1 1 1 1 1 1
best (1,1) (1, 2) (1, 3) (1, 10) (1, 10) (1, 20) (1, 40) (1, 60)
和你輸出(1,60)爲增加比例最高。在不同的陣列,像這樣的:
3 1 4 2 5
然後算法將描繪出這樣的:分鐘3 1 1 1 1 最好(3,3)(3,3) (1,4)(1,4)(1,5)
你會輸出(1,5)。
這整個算法只使用O(1)空間,並運行在O(n)時間,這是一個非常好的解決問題的方法。
或者,您可以考慮通過取數組中所有值的對數,將此問題直接減少到最大單次銷售利潤問題。在這種情況下,如果找到log A [j] - log A [i]被最大化的一對值,則這是等價的(使用對數的性質)來找到一對值,其中log(A [j]/A [i])被最大化。由於對數函數單調增加,這意味着您已經找到了一對值,其中A [j]/A [i]按照預期最大化。
你能澄清'百分比增加'這個詞嗎?它是'finalValue/initialValue'嗎? –
考慮這些數字爲公司在8年(2000年至2008年)期間的生產計數,即生產計數(2000)= 1,生產計數(2001)= 2 ..生產計數(2008)= 60 ;因此,我們的目標是找到生產百分比最高的時間段,這可能是從2000年到2001年,或從2001年到2003年,甚至是2000年到2003年!你需要進一步澄清? –
你的限制是什麼?如果允許空間複雜度爲'O(n)',那麼可以將時間複雜度提高到'O(n)' –