劍指offer 30 連續子陣列的最大和

2022-03-29 11:06:35 字數 1115 閱讀 2186

30. 連續子陣列的最大和

hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如:,連續子向量的最大和為8(從第0個開始,到第3個為止)。給乙個陣列,返回它的最大連續子串行的和,你會不會被他忽悠住?(子向量的長度至少是1)

動態規劃,dp[i] 表示 以a[i]結尾的最大連續子串行和

設當序列以a[i] 結尾時的和最大,如果序列長度為 1 ,那麼dp[i] = a[i],

如果序列長度不為 1, 則序列和為 前面的和 加上 a[i] , 即dp[i] = dp[i - 1] +a[i]; 所以轉移方程為: dp = max(a[i], dp[i - 1] + a[i]);

其實最主要看 dp[i - 1] 是大於0 還是小於0, 如果大於0,那肯定要加上前面的序列,如果小於0,則不要前面的序列; 所以狀態轉移方程可以改為 :dp[i] = dp[i - 1] > 0 ? dp[i - 1] + a[i] : a[i];

再改進後可以改為 

dp[i] = math.max(nums[i], nums[i] + dp[i-1]);

1

class

solution

13return

max;14}

15 }

leetcode執行時間為2ms,空間為45.2mb

時間複雜度:需要遍歷一次陣列,所以時間複雜度為o(n)

空間複雜度:需要乙個和nums陣列等大的dp陣列,所以空間複雜度為o(n)

對思路一的改進,仔細看思路一的**,發現dp陣列其實不需要的,只需要兩個臨時變數儲存 dp[i]和dp[i-1]即可,所以**可以修改為:

1

class

solution

13return

max;14}

15 }

leetcode執行時間為1ms, 空間為45.4mb

時間複雜度:同樣需要遍歷一遍陣列,所以時間複雜度為o(n)

空間複雜度:不需要臨時的dp陣列,所以空間複雜度為o(1)

劍指Offer 30 連續子陣列的最大和

題目 輸入乙個整型陣列,陣列裡有正數也有負數。陣列中乙個或連續的多個整數組成乙個子陣列。求所有子陣列的和的最大值。要求時間複雜度為o n 如輸入陣列 1,2,1,0,3,9 輸出3。我在美團的二面碰到了這道題,當時的想法是不斷構建可變陣列,與預設值即全部元素和比較,得出結果,複雜度o n 2 面試官...

劍指offer 30 連續子陣列的最大和

hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個開始,到第...

劍指offer 30 連續子陣列的最大和

hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個開始,到第...