劍指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-例題 連續子陣列的最大和陣列
- 劍指office--31. 連續子陣列的最大和陣列
- 劍指 Offer 42.連續子陣列的最大和陣列
- 《劍指Offer》- 連續子陣列的最大和或最小和陣列
- 連續子陣列的最大和陣列
- 劍指Offer:JZ30-連續子陣列最大和(解題思路+Java程式碼)陣列Java
- JZ-030-連續子陣列的最大和陣列
- 每日一練(22):連續子陣列的最大和陣列
- 牛客題霸--連續子陣列的最大和陣列
- 劍指offer-轉陣列的最小數字-php陣列PHP
- 劍指Offer-把陣列中的數排成一個最小的數陣列
- [每日一題] 第十五題:連續子陣列的最大和每日一題陣列
- nowcoder-劍指offer-二維陣列的查詢陣列
- 雙指標查詢陣列的連續規律子陣列問題指標陣列
- 劍指OFFER-數字在升序陣列中出現的次數(Java)陣列Java
- 最短無序連續子陣列陣列
- 最大連續子陣列和的實現陣列
- 劍指OFFER-從頭到尾列印連結串列(Java)Java
- leetcode最短無序連續子陣列LeetCode陣列
- 劍指offer-第2章
- 【劍指offer】二維陣列中的查詢陣列
- 劍指offer-用兩個棧實現佇列-php佇列PHP
- 劍指offer-從尾到頭列印連結串列-phpPHP
- 【leetcode】53. Maximum Subarray 連續子序列的最大和LeetCode
- 劍指Offer-37-陣列中逆序對陣列
- 劍指offer-替換空格02
- 劍指Offer--陣列中重複的數字陣列
- 【劍指offer】【1】二維陣列中的查詢陣列
- 劍指offer——陣列中的逆序對C++(75%)陣列C++
- 劍指 offer(1) -- 陣列篇陣列
- 最大連續子陣列和(最大子段和)陣列
- 二維陣列中的查詢——牛客劍指offer陣列
- 劍指 Offer 04. 二維陣列中的查詢陣列
- 劍指 offer 第一題: 二維陣列中的查詢陣列
- Leetcode 劍指 Offer 03. 陣列中重複的數字LeetCode陣列
- 1. 二位陣列中的查詢(劍指offer)陣列
- C++陣列的連續性C++陣列
- 給出一個由[-100,100]之間整陣列成的陣列,求其相加和最大的連續子陣列 輸入 一個連續整陣列成的陣列 輸出 子陣列相加的最大值 樣例輸入 -......陣列