劍指Offer-連續子陣列中的最大和
題目
輸入一個整型陣列,陣列裡有正數也有負數。陣列中的一個或連續多個整陣列成一個子陣列。求所有子陣列的和的最大值。要求時間複雜度為 O(n).
輸入
[1,-2,3,10,-4,7,2,-5]
返回值
18
說明:
輸入的陣列為{1,-2,3,10,—4,7,2,一5},和最大的子陣列為{3,10,一4,7,2},因此輸出為該子陣列的和 18。
分析
定義一個dp陣列,dp[i]表示前i個元素的最大和。狀態方程
dp[i] = dp[i-1]<0?array[i]:dp[i-1]+array[i-1];
當前元素與他前面的元素的在求最大和時有兩個選擇,如果,前面子陣列的最大和時正數就加上前面陣列的最大和,反之不加。最後宣告一個max變數儲存最大值。最終返回max;
例如:
[1,-2,3,10,-4,7,2,-5]
dp[0] = 1
dp[1] = -1
dp[2] = 3
dp[3] = 13
dp[4] = 9
dp[5] = 16
dp[6] = 18
dp[7] = 13
所以最終最大和是dp[6] = 18
程式碼實現
public class Solution {
public int FindGreatestSumOfSubArray(int[] array) {
//如果陣列為空返回0
if(array == null) return 0;
//當前元素與他前面的元素的關係只有兩種狀態,加上與不加上他們的最大值,加不加看dp[i-1]的正負也即是
//dp[i] = dp[i-1]<0?array[i]:dp[i-1]+array[i-1];
//max = Math.max(dp[i],max)
int len = array.length;
int dp[] = new int[len];
dp[0] = array[0];
int max=array[0];
for(int i=1;i<len;i++){
dp[i] = dp[i-1]<0?array[i]:dp[i-1]+array[i];
max = Math.max(dp[i],max);
}
return max;
}
}
空間複雜度O(n);時間複雜度O(n);
太菜了演算法,繼續努力吧!
相關文章
- 劍指offer-例題 連續子陣列的最大和陣列
- 【劍指offer】連續子陣列的最大和陣列
- 劍指 Offer 42.連續子陣列的最大和陣列
- 劍指office--31. 連續子陣列的最大和陣列
- 《劍指Offer》- 連續子陣列的最大和或最小和陣列
- 連續子陣列的最大和陣列
- 劍指Offer:JZ30-連續子陣列最大和(解題思路+Java程式碼)陣列Java
- Maximum Subarray 連續子陣列最大和陣列
- JZ-030-連續子陣列的最大和陣列
- 牛客題霸--連續子陣列的最大和陣列
- 每日一練(22):連續子陣列的最大和陣列
- 劍指offer-轉陣列的最小數字-php陣列PHP
- 劍指Offer-把陣列中的數排成一個最小的數陣列
- [每日一題] 第十五題:連續子陣列的最大和每日一題陣列
- nowcoder-劍指offer-二維陣列的查詢陣列
- 劍指OFFER-數字在升序陣列中出現的次數(Java)陣列Java
- 【演算法拾遺】三種方法求連續子陣列的最大和演算法陣列
- 【劍指offer】陣列中的逆序對陣列
- 一維子陣列最大和陣列
- 劍指OFFER-從頭到尾列印連結串列(Java)Java
- 最短無序連續子陣列陣列
- 劍指offer-用兩個棧實現佇列-php佇列PHP
- 劍指offer-從尾到頭列印連結串列-phpPHP
- 最大連續子陣列和的實現陣列
- 【劍指offer】二維陣列中的查詢陣列
- 演算法學習-零子陣列,最大連續子陣列演算法陣列
- 劍指Offer-37-陣列中逆序對陣列
- 雙指標查詢陣列的連續規律子陣列問題指標陣列
- 劍指offer-字串空格替換為“ ”字串
- 劍指Offer--陣列中重複的數字陣列
- 劍指offer——陣列中的逆序對C++(75%)陣列C++
- 【劍指offer】【1】二維陣列中的查詢陣列
- 《劍指offer》:[51]陣列中的重複數字陣列
- 劍指 offer(1) -- 陣列篇陣列
- 二維陣列中的查詢——牛客劍指offer陣列
- 劍指 Offer 04. 二維陣列中的查詢陣列
- 求子陣列的最大和陣列
- leetcode最短無序連續子陣列LeetCode陣列