算法-动态规划-最大子序和
1 题目概述
1.1 题目出处
https://leetcode-cn.com/problems/maximum-subarray/
1.2 题目描述
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
2 暴力枚举滑动窗口法
2.1 思路
窗口大小从1到nums.length,每次都已单位1往右滑动。
2.2 代码
class Solution {
public int maxSubArray(int[] nums) {
int max = nums[0];
int windowSize = 1;
while(windowSize <= nums.length){
for(int cur = 0; cur <= (nums.length - windowSize); cur++){
int tmp = 0;
for(int i = cur; i < cur + windowSize; i++){
tmp += nums[i];
}
max = Math.max(max, tmp);
}
windowSize++;
}
return max;
}
}
2.3 时间复杂度
时间复杂度太高,直接崩了
2.4 空间复杂度
O(1)
3 动态规划
3.1 思路
考虑动态规划,dp[i]表示选择当前节点最大和,是取的只选择当前节点和当前节点以及前一个节点最大和中的大者。
遍历过程中维护一个max,初值为nums[0],遍历过程持续比较,最终返回max即可。
3.2 代码
class Solution {
public int maxSubArray(int[] nums) {
int max = 0;
if(nums == null || nums.length == 0){
return max;
}
if(nums.length == 1){
return nums[0];
}
int[] dp = new int[nums.length];
dp[0] = nums[0];
max = dp[0];
for(int i = 1; i < nums.length; i++){
dp[i] = Math.max(dp[i-1] + nums[i], nums[i]);
if(dp[i] > max){
max = dp[i];
}
}
return max;
}
}
3.3 时间复杂度
O(N)
3.4 空间复杂度
O(N)
4 分治法
参考解法解读