53. 最大子序和
難度簡單1886
給定一個整數數組 nums
,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。
示例:
輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6
解釋: 連續子數組 [4,-1,2,1] 的和最大,爲 6。
進階:
如果你已經實現複雜度爲 O(n) 的解法,嘗試使用更爲精妙的分治法求解。
通過次數215,842
提交次數427,865
思路:
此題可以採用暴力法,但是效率很顯然是o(n*n)。因此並不建議使用。既然題目要求最大子序列和,我們容易想到用貪心算法求解。
代碼:
public static int maxSubArray2(int[] nums){
int res = nums[0];
int sum = 0;
//定義一個sum,用來計數當前選擇的子數組累加和
for (int num : nums) {
if (sum>0){
sum+=num;
}else{
sum=num;
}
res=Math.max(res,sum);
}
return res;
}
此外,既然可以用貪心算法求解,我們也可以嘗試一下動態規劃dp,也可以求解此題。
思路:
我們先找到動態轉移方程:
讀題目我們可以寫出如下動態轉移方程
dp[i] = Math.max(dp[i-1],0)+nums[i];
代碼:
public static int maxSubArray(int[] nums) {
int len = nums.length;
if (len==1){
return nums[0];
}
int [] dp=new int[len];
dp[0] = nums[0];
int max=nums[0];
for (int i = 1; i < len; i++) {
dp[i] = Math.max(dp[i-1],0)+nums[i];
if (dp[i]>max){
max = dp[i];
}
}
return max;
}
小結:博主建議大家要嘗試自己動手推到一下dp方程,理解動態規劃的思想,這兩個算法是·經點算法,希望大家都可以掌握!