题解一:
动态规划:这是一道经典的动态规划题。维护一个dp数组,dp[i]表示0~i组成的数组的最大子数组和。当数组长度为1时,最大和连续子数组是它本身,也就是dp[i]=nums[i]。当数组长度每增加1时,最大和连续子数组有两种可能,一是原先的最大和连续子数组加上增加的元素dp[i - 1] + nums[i],二是舍弃掉原先的最大连续子数组,以这个增加的元素作为起始建立的新的连续子数组nums[i],我们选择其中的较大值。
动态规划只确保决策过程的最优化,而不保证结果的最优化,所以最后我们需要找出dp数组中的最大值作为结果。
class Solution {
public int maxSubArray(int[] nums) {
int[] dp = new int[nums.length];
int result;
dp[0] = nums[0];
result = dp[0];
for (int i = 1; i < nums.length; i++) {
dp[i] = Math.max(nums[i], dp[i - 1] + nums[i]);
if (dp[i] > result) result = dp[i];
}
return result;
}
}