【LeetCode】53. 最大子数组和

这篇具有很好参考价值的文章主要介绍了【LeetCode】53. 最大子数组和。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

53. 最大子数组和(中等)

【LeetCode】53. 最大子数组和

【LeetCode】53. 最大子数组和

【LeetCode】53. 最大子数组和

思路

这道题的状态设计和状态转移和 300. 最长递增子序列 类似。但是这里要求的是连续子数组,和子序列不同。

状态定义

首先定义 dp[i]:以 nums[i] 结尾的具有最大和的连续子数组。

状态转移方程

根据状态的定义,dp[i] 一定包含 nums[i]

这里我们假设 nums[i] > 0,则一定有 dp[i] = dp[i-1] + nums[i],对于 dp[i-1] 无非两种情况,要么 >= 0 ,要么小于 0。

  • 如果dp[i-1] >= 0 ,此时再加入 nums[i],能够得到和更大的连续子数组;
  • 如果 dp[i-1] < 0 ,那么 nums[i] > dp[i-1] ,所以可以构建新的连续子数组,只包含 nums[i] 这个元素,即dp[i] = nums[i];

综合上述两种情况,我们可以统一考虑,即 dp[i] = max(nums[i], dp[i-1] + nums[i]);

初始化

dp[0] 意味着以 nums[0] 结尾,因此连续子数组中只包含 nums[0], 那么此时连续子数组的和为 nums[0] 的值,即 dp[0] = nums[0];

返回的最终结果

这道题和一般的动态规划不一样,不是直接返回dp[n-1],而是要返回以 nums[i] 结尾的所有情况中的最大值,即 return *max_element(dp.begin(), dp.end());文章来源地址https://www.toymoban.com/news/detail-431655.html

代码

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int n = nums.size();
        vector<int> dp(n);
        dp[0] = nums[0];
        for(int i=1; i<n; ++i){
            dp[i] = max(nums[i], dp[i-1] + nums[i]);
        }
        return *max_element(dp.begin(), dp.end());
    }
};

到了这里,关于【LeetCode】53. 最大子数组和的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 动态规划——最大子数组和(Leetcode 53)

    解题代码: ===== int maxSubArray(int* nums, int numsSize){ int pre = 0, maxAns = nums[0]; 自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。 深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训

    2024年04月26日
    浏览(38)
  • LeetCode:53. 最大子数组和 - Python

    53. 最大子数组和 问题描述: 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例 1: 输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。 提示

    2024年02月11日
    浏览(35)
  • 【LeetCode每日一题】53. 最大子数组和

    https://leetcode.cn/problems/maximum-subarray/description/ 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 先算出数组的前缀和,然后通过2个for循环遍历出所有的连续子数组。 寻找一个具有

    2024年02月04日
    浏览(54)
  • 算法leetcode|53. 最大子数组和(rust重拳出击)

    给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 1 = nums.length = 10 5 -10 4 = nums[i] = 10 4 面对这道算法题目,二当家的再次陷入了沉思。 刚开始以为要暴力破解,双循环什么的,但

    2024年02月08日
    浏览(43)
  • leetcode每日一练-第53题-最大子数组和

    一、思路 动态规划 二、解题方法 使用了两个变量 maxSum 和 currentSum 来分别记录全局的最大和和当前连续子数组的和。遍历数组时,我们不断更新 currentSum ,并比较是否需要更新 maxSum 。最后, maxSum 就是最大的连续子数组和。 三、code ===================================================

    2024年02月10日
    浏览(36)
  • LeetCode_动态规划_中等_918.环形子数组的最大和

    给定一个长度为 n 的环形整数数组 nums ,返回 nums 的非空子数组的最大可能和。 环形数组意味着数组的末端将会与开头相连呈环状。形式上, nums[i] 的下一个元素是 nums[(i + 1) % n] , nums[i] 的前一个元素是 nums[(i - 1 + n) % n] 。 子数组最多只能包含固定缓冲区 nums 中的每个元素

    2024年02月09日
    浏览(43)
  • 【LeetCode: 53. 最大子数组和 | 暴力递归=>记忆化搜索=>动态规划 | 分治法 】

    🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文

    2023年04月21日
    浏览(95)
  • LeetCode刷题 | 1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和

    给定两个字符串  text1  和  text2 ,返回这两个字符串的最长  公共子序列  的长度。如果不存在  公共子序列  ,返回  0  。 一个字符串的  子序列   是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后

    2024年02月12日
    浏览(44)
  • LeetCode_动态规划_中等_1749.任意子数组和的绝对值的最大值

    给你一个整数数组 nums 。一个子数组 [nums l , nums l+1 , …, nums r-1 , nums r ] 的 和的绝对值 为 abs(nums l + nums l+1 + … + nums r-1 + nums r ) 。请你找出 nums 中和的绝对值 最大的任意子数组(可能为空),并返回该最大值。 abs(x) 定义如下: 如果 x 是负整数,那么 abs(x) = -x 。 如果 x 是非

    2024年02月13日
    浏览(35)
  • 53. 最大子数组和

    题目 示例 提示 思路 如果数组都是正数的话,全部加起来就好了,题目中给出的**num[i]**可能为负数,就会涉及到比如在区间[i,j]之间上的最大和为sum1的话,加上下一个元素 num[j+1],是否可能是小于sum1的,如果小于的话,就舍弃,另外如果sum1本来就是负数的话,就可以直接把

    2024年02月11日
    浏览(19)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包