题目
给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例1:
1 | 输入: [-2,1,-3,4,-1,2,1,-5,4], |
示例2:
1 | 输入:nums = [1] |
示例3:
1 | 输入:nums = [5,4,-1,7,8] |
提示:
1 <= nums.length <= 10^5
-10^4 <= nums[i] <= 10^4
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
解法:
解法一:贪心
时间复杂度为O(n)的遍历算法。假设当前和为currSum,当遍历到数组的第i个元素时,如果此时当前和小于等于0,那么将当前和currSum设置为nums[i],否则,currSum = currSum + nums[i]。在遍历的过程中记录currSum的最大值返回即可。
Java
1 | public int maxSubArray(int[] nums) { |
解法二:动态规划
从解法一种可以获得启发,在遍历的过程中,当前的最大值,要么是上一个数字时的最大值,或者为0,加上当前值。因此,很容易就找到状态转移方程。
dp[i] = max(dp[i - 1], 0)
dp[0] = nums[0]
Java
1 | public int maxSubArray(int[] nums) { |
解法三:动态规划-优化空间
解法二中的dp数组可以转为一个常数
Java
1 | public int maxSubArray(int[] nums) { |