Leetcode之动态规划(DP)专题-53. 最大子序和(Maximum Subarray)



给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

进阶:

如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。



定义:dp[i] 表示从起点到index=i的这个段内的最大子序和。

例如:dp[1] = 在[-2,1]这个区间里面的最大子序和,dp[1]=1

写出状态转移方程:dp[i] = max( dp[i-1] , 0) + nums[i];

例如:

[-2,1]里,dp[1]可能是nums[1]自己的值,也可能是nums[0]+nums[1]的值,

因为dp[0] = -2,所以当计算dp[1]的时候,我们首先用dp[0]和0比,发现dp[0]<0,那我们就舍弃dp[0],只要nums[i]的值

写出初始版本:

class Solution {
   public int maxSubArray(int[] nums) {
        int ans = 0;
        int n = nums.length;
        int[] dp = new int[n];
        dp[0] = nums[0];
        ans = nums[0];
        for (int i = 1; i < n; i++) {
            dp[i] = Math.max(0,dp[i-1])+nums[i];
            ans = Math.max(ans,dp[i]);
        }
        return ans;
    }
}

我们可以进一步优化,即把dp[i-1]用一个变量代替。

优化版本:

class Solution {
   public int maxSubArray(int[] nums) {
        int ans = Integer.MIN_VALUE;
        int n = nums.length;
        int last = 0;
        for (int i = 0; i < n; i++) {
            int temp = Math.max(0,last)+nums[i];
            ans = Math.max(ans,temp);
            last = temp;
        }
        return ans;
    }
}

原文地址:https://www.cnblogs.com/qinyuguan/p/11473973.html

时间: 2024-10-05 07:20:49

Leetcode之动态规划(DP)专题-53. 最大子序和(Maximum Subarray)的相关文章

最大子数组问题 Maximum Subarray

Maximum Subarray 标签(空格分隔): algorithm 这个问题我们先看下问题的描述: 问题描述 Find the contiguous subarray within an array (containing at least one number) which has the largest sum. For example, given the array [?2,1,?3,4,?1,2,1,?5,4], the contiguous subarray [4,?1,2,1

leetcode 53. 最大子序和

O(n)时间O(1)空间 class Solution { public: int maxSubArray(vector<int>& nums) { int len=nums.size(); if(len==0) return 0; int dp=nums[0]; int res=nums[0]; //dp表示以i元素结尾的最大子串 for(int i=1;i<len;i++){ dp=max(nums[i],dp+nums[i]); res=max(dp,res); } ret

【leetcode算法-简单】53. 最大子序和

[题目描述] 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6.进阶: 如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解. [解答] 解法:动态规划法   如果Sum<0,那么 Sum + nums[i] < nums[i] ,在这种情况下,Sum 对 nums[i] 没有任何的增益效果

53最大子序和.py

题目:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 来源:https://leetcode-cn.com/problems/maximum-subarray/solution/ 法一:动态规划 思路:关键是要正确的写出状态转移方程.dp[i]表示的是以nums[i]结尾的最大子串和,注意不是nums[i]中的最大子串和,如果是nums[i]中的最大子串和,则状态转移方程较复杂,无法直接写出. 参考:https://leetcode-cn.

53. 最大子序和

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6. 进阶: 如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解. O(n)复杂度: class Solution { public: int maxSubArray(vector<int>& nums) { int maxn =

53. 最大子序和(c++)

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例:输入: [-2,1,-3,4,-1,2,1,-5,4],   输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6. 进阶:  如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解. int maxSubArray(vector<int>& nums) { if(nums.size() == 0)  return -1; int ans = 

LeetCode 第53题,最大子序和

题目概述 题目:力扣:53.最大子序和 难易:简单 内容: 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6. 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximum-subarray 第一次思路 首先将数组类型分为三类:1.空数组 2.只有一个

代码题(25)— 最大子序和、最长上升子序列

1.53. 最大子序和 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6. class Solution { public: int maxSubArray(vector<int>& nums) { if(nums.empty()) return 0; int res = nums[0]; int

Leetcode之动态规划(DP)专题-63. 不同路径 II(Unique Paths II)

初级题目:Leetcode之动态规划(DP)专题-62. 不同路径(Unique Paths) 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”). 现在考虑网格中有障碍物.那么从左上角到右下角将会有多少条不同的路径? 网格中的障碍物和空位置分别用 1 和 0 来表示. 说明:m 和 n 的值均不超过 100. 示例 1: 输入: [   [0,0,0],