题目:
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
解析:
采用动态规划的思想。
详细看注释。
public int maxSubArray(int[] nums) {
int n = nums.length;
if(n == 0) return 0;
//定义dp数组,dp数组中的每个值dp[i]代表着以nums[i]为结尾的最大子序和
int[] dp = new int[n];
//以nums[0]结尾的最大子序和就是nums[0]
dp[0] = nums[0];
//遍历,通过状态转移方程求得dp[i]的最大子序和
for(int i = 1; i < n; ++i){
//dp[i]的最大子序和要么是自成一派最大,要么就是当前值加上前面i - 1个数的最大子序和
dp[i] = Math.max(nums[i], nums[i] + dp[i - 1]);
}
//遍历dp数组,求得dp数组中的最大值,就是该题的答案
int res = Integer.MIN_VALUE;
for(int j = 0; j < dp.length; ++j){
res = Math.max(res, dp[j]);
}
return res;
}