解法:解法 : 動態規劃
動態規劃狀態定義 : dp[i] 表示包含第i個元素的最大子序和
狀態轉移方程:dp[i] = max
初始狀態:dp[0] = nums[0];
// 2.14 求陣列的子陣列之和的最大值
class test;
print(arr);
system.out.println(maxsubarray2(arr));
print(maxsubarraypos(arr));
} public static void print(int arr)
/**動態規劃
狀態定義
dp[i] 表示包含第i個元素的最大子序和
狀態轉移方程
dp[i] = max
初始狀態:
dp[0] = nums[0];
*/public static int maxsubarray(int nums)
int res = integer.min_value;
for(int num:dp) res = math.max(num,res);
return res;
}/**
拓展問題:
1 如果陣列[a[0], ...,a[n-1]]首尾相連,題目又該如何解釋?
2 如果題目要求同時返回最大子陣列的位置,演算法應該如何改變?還能保持$o(n)$的時間複雜度麼?
*//**
拓展問題1:
*/public static int maxsubarray2(int nums)
int res = integer.min_value;
for(int num:dp) res = math.max(num,res);
return res;
}/**
拓展問題2:
return [start,end]
*/public static int maxsubarraypos(int nums)
int max = integer.min_value;
for(int num:dp) max = math.max(max,num);
int res = new int[2];
for(int i = 0;iint start;
for(start= res[1];max!=0;start--) max-=nums[start];
res[0] = start-1;
return res;
}}
程式設計之美2 14 求陣列的子陣列之和的最大值
問題描述 乙個有n個整數元素的一維陣列 a 0 a 1 a n 1 它包含很多子陣列,求子陣列之和的最大值,當陣列元素全部為負的時候,有兩種處理辦法,第一種是返回0,第二種是返回陣列中最大的負數。解法1 使用暴力法,假設最大的一段陣列為a i a j 則對i 0 n 1 j i n 1,遍歷一遍,求...
程式設計之美2 14 求陣列的子陣列之和的最大值
這是乙個在面試中出現概率很高的一道題目,就拿我來說吧,面試了5家公司中,兩家公司問了這道題目,可見,這道題目是非常經典的。解題思想也不是很難,我熟悉的有 兩種解題辦法 1.一直連加,終止當前序列的條件是連加的和是負數 因為,乙個數加上乙個負數之後肯定是沒有原來的數值大,所以,這肯定是沒有意義的,最終...
程式設計之美 2 14 求陣列的子陣列之和的最大值
這個以前寫過,見求陣列的最長子陣列之和的最大值 這裡說一下後面擴充套件題目。1.簡述 1 如果陣列首尾相連,即允許找到一組數字 a i a n 1 a 0 a j 請使其和最大,怎麼辦?2 如果題目要求返回最大子陣列的位置,演算法應該如何改變?還能保持o n 的複雜度麼?2.思路 第乙個問題,書上給...