题目描述
输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
示例1:
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
提示:
1 <= arr.length <= 10^5
-100 <= arr[i] <= 100
方法
动态规划法
思路:
看见题目属于简单,心里就有自信了。知道动态规划法,看见这个题应该很快上手。
- 定义状态:根据题目要求定义状态, d p [ i ] dp[i] dp[i]表示以 n u m s [ i ] nums[i] nums[i]结尾的连续数组的最大和。
- 状态转移方程:对于 d p [ i + 1 ] dp[i+1] dp[i+1]的取值, 考虑 d p [ i ] dp[i] dp[i]追加 n u m s [ i + 1 ] nums[i+1] nums[i+1]组成新连续数组和,以及单数组 n u m s [ i + 1 ] nums[i+1] nums[i+1]这两种情况,取这两个这的较大值。
- 边界条件: d p [ 0 ] = n u m s [ 0 ] dp[0]=nums[0] dp[0]=nums[0]
java代码
public int maxSubArray(int[] nums) {
int n = nums.length;
int[] dp = new int[n];
// 边界条件
dp[0] = nums[0];
// 状态转移方程
for(int i=1; i<n; i++){
dp[i] = Math.max(nums[i], dp[i-1]+nums[i]);
}
// 取最大值
Arrays.sort(dp);
int max_value = dp[n-1];
return max_value;
}