给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。
样例
样例1:
输入:[−2,2,−3,4,−1,2,1,−5,3]
输出:6
解释:符合要求的子数组为[4,−1,2,1],其最大和为 6。
样例2:
输入:[1,2,3,4]
输出:10
解释:符合要求的子数组为[1,2,3,4],其最大和为 10。
挑战
要求时间复杂度为O(n)
注意事项
子数组最少包含一个数
解法一:贪心。max记录全局最大值,sum记录区间和,如果当前sum>0,那么可以继续和后面的数求和,否则就从0开始
public class Solution {
/**
* @param nums: A list of integers
* @return: A integer indicate the sum of max subarray
*/
public int maxSubArray(int[] nums) {
//max记录全局最大值,sum记录区间和
//如果当前sum>0,那么可以继续和后面的数求和,否则就从0开始
int max = Integer.MIN_VALUE, sum = 0;
for(int i=0; i<nums.length; i++){
sum += nums[i];
max = Math.max(max, sum);
sum = Math.max(sum, 0);
}
return max;
}
}
解法二:动态规划。设dp[i]表示以i为结尾子数组的最大和,公式:dp[i] = max(dp[i-1] + nums[i], nums[i]);
再设res为所有子数组的最大和
public class Solution {
/**
* @param nums: A list of integers
* @return: A integer indicate the sum of max subarray
*/
public int maxSubArray(int[] nums) {
//dp[i]表示以i为结尾子数组的最大和
int[] dp = new int[nums.length];
dp[0] = nums[0];
int res = nums[0];
for(int i=1; i<nums.length; i++){
dp[i] = Math.max(dp[i-1]+nums[i], nums[i]);
res = Math.max(res, dp[i]);
}
return res;
}
}