首页 > 其他分享 >LeetCode 53. 最大子数组和

LeetCode 53. 最大子数组和

时间:2023-09-11 14:07:16浏览次数:40  
标签:最大 nums int 53 我们 数组 LeetCode dp

最大子数组和(medium)

题目链接:

53. 最大子数组和

题目描述:

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。

示例 1:

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

示例 2:

输入:nums = [1]
输出:1

示例 3:

输入:nums = [5,4,-1,7,8]
输出:23

题目解析

解释一下什么是子数组.很简单,我们把数组里面的元素连接一起就可以认为是一个子数组.题目就是求我们子数组的最大和.这里我们用实例3三做演示.

image-20230910205924702

也就是要求的数组里面的最大连续子数组的和.

算法原理

状态表示

按照经验,我们以...为结尾表示状态.

dp[i]:表示以i位置为结尾,我们最大子数组最大的连续和.

状态转移方程

这里我们想一下.对于我们的nums[i].这里我们可以有两个选择.

  • 选择nums[i]这一个元素作为我们的子数组 dp[i] = nums[i]
  • 和i-1联合作为子数组. dp[i] = dp[i-1]+nums[i]

那么这里我们求最大值.dp[i] = max(nums[i], dp[i-1]+nums[i]);

初始化

借助了i-1位置,那么此时我们多加上一个节点.那么求第一个元素,我们dp[1]一定是第一个元素,那么dp[0] = 0就可以满足这个了.

填表顺序

从左向由填.

返回值

题目要求的最大和,那么我们这里使用一个变量保存最大就可以了.

编写代码

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

image-20230910210958961

标签:最大,nums,int,53,我们,数组,LeetCode,dp
From: https://blog.51cto.com/byte/7435485

相关文章

  • LeetCode 918. 环形子数组的最大和
    环形子数组的最大和(medium)题目链接:918.环形子数组的最大和题目描述:给定一个长度为n的环形整数数组nums,返回nums的非空子数组的最大可能和。环形数组意味着数组的末端将会与开头相连呈环状。形式上,nums[i]的下一个元素是nums[(i+1)%n],nums[i]的前一......
  • swift5 区间类型和数组转化
    在Swift5中,你可以使用区间(Range)类型来表示一系列连续的数字,并且可以使用一些内置的函数和方法将区间类型和数组(Array)之间进行转换。首先,我们来了解一下如何创建和使用区间类型。创建区间类型:swiftletrange=1...5//创建一个闭区间,包括1到5letopenRange=1..<5//创建......
  • 剑指 Offer 56 - II. 数组中数字出现的次数 II
    题目链接:剑指Offer56-II.数组中数字出现的次数II题目描述:在一个数组nums中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。解法思路:代码:......
  • LeetCode/将石头分散到网格的最少移动次数
    给你一个大小为3*3,下标从0开始的二维整数矩阵grid,分别表示每一个格子里石头的数目。网格图中总共恰好有9个石头,一个格子里可能会有多个石头。每一次操作中,你可以将一个石头从它当前所在格子移动到一个至少有一条公共边的相邻格子。请你返回每个格子恰好有一个石头的......
  • 【学习笔记】树状数组
    PS:未经许可,禁止转载。思路来源于我的老师$\text{hoogy}$,非常感谢,%%%。-五分钟丝滑动画讲解|树状数组-〔manim|算法|数据结构〕完全理解并深入应用树状数组单点修改,区间查询前置芝士:一维前缀和设原数组$a$,前缀和数组$b$,则有:$b[i]=\sum\limits_{j=1}^ia[j]$。推......
  • #yyds干货盘点# LeetCode程序员面试金典:翻转二叉树
    题目:给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]代码实现:classSolution{publicTreeNodeinvertTree(TreeNoderoot){......
  • #yyds干货盘点# LeetCode程序员面试金典:第三大的数
    1.简述:给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。 示例1:输入:[3,2,1]输出:1解释:第三大的数是1。示例2:输入:[1,2]输出:2解释:第三大的数不存在,所以返回最大的数2。示例3:输入:[2,2,3,1]输出:1解释:注意,要求返回第三大的数,是指在所......
  • 数组
        ......
  • 前缀和数组
    classPrefixSum{//前缀和数组privateint[]prefix;/*输⼊⼀个数组,构造前缀和/publicPrefixSum(int[]nums){prefix=newint[nums.length+1];//计算nums的累加和for(inti=1;i<prefix.length;i++){prefix[i]=prefix[i-1]+nums[i-1];}}/......
  • 练习:分治算法--有序数组寻找中位数
    题:给定两个长度为m和n有序组数array1和array2,请找出这个有序数组的中位数。'''eg.[1,3]和[5,6],中位数是4[1,2,5,8,9]和[2,3,4,5],中位数是4'''###直接方法,使用内置排序函数sort#时间复杂度最高:O((n+m)log(n+m)),空间复杂度:O(n+m)1classSolution(object):2deff......