题意理解:
给你一个整数数组
nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。
所以每个元素都有两个状态,是前一部分的延续,或从此处重新开始计算。
我们采用动态规划思路来解题。
解题思路:
(1)定义dp数组
dp[i]表示0到i的累加的最大和
(2)初始化
dp[0]=nums[0]
其余位置不重要会被之后的操作覆盖
(3)递推公式
dp[i]=max(dp[i-1]+nums[i],nums[i])
(4) 答案:max(dp)
1.解题
public int maxSubArray(int[] nums) {
int[] dp=new int[nums.length];
dp[0]=nums[0];
int max=nums[0];
for(int i=1;i<nums.length;i++){
dp[i]=Math.max(dp[i-1]+nums[i],nums[i]);
max=Math.max(max,dp[i]);
}
return max;
}
2.分析
时间复杂度:O(n)
空间复杂度:O(n)