给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1] 输出:1
示例 3:
输入:nums = [0] 输出:0
示例 4:
输入:nums = [-1] 输出:-1
对于面试题目,一般面试官希望看到的结果都不是暴力法,哪怕是一个dfs剪枝,也要比暴力法好。
这道题目应该使用动态规划来求解,让我们再来分析一下这个问题。
在这个问题中,我们发现,如果我们从前向后遍历数组,一个子数组的下一个元素是正数,那么加入这个元素一定是更好的方案。
如果小于零,那么加入这个元素后的子数组一定不如之前的子数组,之前的子数组就是一个局部最优解。
在整个过程中,我们去比较局部最优解中的最大值,就可以得到最优的子数组。
class Solution { public int maxSubArray(int[] nums) { // dp[i] 表示以nums[i]结尾的最大和 int[] dp = new int[nums.length]; dp[0] = nums[0]; int res = dp[0]; for (int i = 1; i <nums.length ; i++) { dp[i] = dp[i-1]>0 ? dp[i-1]+nums[i] : nums[i]; res = Math.max(res,dp[i]); } return res; } }