1. 程式人生 > >每天學習一算法系列(4) (輸入一個整形陣列,數組裡有正數也有負數,陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和)

每天學習一算法系列(4) (輸入一個整形陣列,數組裡有正數也有負數,陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和)

題目:

輸入一個整形陣列,數組裡有正數也有負數,陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。
求所有子陣列的和的最大值。要求時間複雜度為O(n)。
例如輸入的陣列為1, -2, 3, 10, -4, 7, 2, -5,和最大的子陣列為3, 10, -4, 7, 2,
因此輸出為該子陣列的和18。

思路一:

老實說我一開始看到該題目的時候到想到解法還是花了點時間,具體思路是這樣,因為時間複雜度是0(n),所以我們只能用一次遍歷就要求出最大的子陣列和,所以我的想法是這樣:以空間換取時間,用一個和原來陣列一樣大的臨時陣列記錄遍歷過程中的和,遍歷過程中依次對每個Item都同樣進行以下的動作:當遇到負數的時候,就把當前的Sum值記錄到臨時陣列中,然後判斷當前的Item的絕對值是否大於Sum,如果大於,將Sum恢復為原來的初始值,也就是Sum = 0,如果Item的絕對值小於Sum的話就把Sum += Item值。當然如果遍歷過程中遇到的Item > 0的情況,直接Sum += Item.等到遍歷結束後,從臨時陣列中捉取最大值就是最大的子陣列和的值。

程式碼如下:

  

思路二:

其實這道題只要一次遍歷就可以求出最大的子陣列和,而且是很簡單的就解決了,具體想法是這樣,不斷的累加每個陣列元素,並用一個變數儲存當前的最大值,累加的過程一直和該變數進行比對,如果大於最大值,就把當前的最大值儲存下來,反覆如此就可以求出最大值.

上面給出的演算法太複雜,以下的演算法是在上面的基礎上進行改進,而且是很容易理解。程式碼如下: