牛客题解 | 连续子数组的最大和

news/2025/2/21 10:15:24/文章来源:https://www.cnblogs.com/wc529065/p/18728700

题目

题目链接

描述

这是一篇针对初学者的题解,共用两种方法解决。
知识点:数组,动态规划
难度:一星

题解

题目抽象:给定一个数组,求连续子数组的最大和。

方法一:动态规划

状态定义:dp[i]表示以i结尾的连续子数组的最大和。所以最终要求dp[n-1]
状态转移方程:dp[i] = max(array[i], dp[i-1]+array[i])
解释:如果当前元素为整数,并且dp[i-1]为负数,那么当然结果就是只选当前元素
技巧:这里为了统一代码的书写,定义dp[i]表示前i个元素的连续子数组的最大和,结尾元素为array[i-1]

代码

class Solution {
public:int FindGreatestSumOfSubArray(vector<int> array) {int sz = array.size();vector<int> dp(sz+1, 1);dp[0] = 0; // 表示没有元素int ret = array[0];for (int i=1; i&lt;=sz; ++i) {dp[i] = max(array[i-1], dp[i-1]+array[i-1]);ret = max(ret, dp[i]);}return ret;}
};

时间复杂度:O(n)
空间复杂度:O(n)

方法二:空间复杂度O(1)解法

思想很简单,就是对下标为i的元素array[i],先试探的加上array[i], 如果和为负数,显然,以i结尾的元素对整个结果不作贡献。
具体过程:

  1. 初始化:维护一个变量tmp = 0
  2. 如果tmp+array[i] < 0, 说明以i结尾的不作贡献,重新赋值tmp = 0
  3. 否则更新tmp = tmp + array[i]
    最后判断tmp是否等于0, 如果等于0, 说明数组都是负数,选取一个最大值为答案。

代码

class Solution {
public:int FindGreatestSumOfSubArray(vector<int> array) {int ret = 0;int tmp = 0;for (const int k : array) {if (tmp + k < 0) {tmp = 0;}else {tmp += k;}ret = max(ret, tmp);}if (ret != 0)return ret;return *max_element(array.begin(), array.end());}
};

时间复杂度:O(n)
空间复杂度:O(1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/887491.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客题解 | 链表中倒数最后k个结点

牛客输入输出题单题解题目 题目链接 题目的主要信息:一个长度为\(n\)的链表,返回原链表中从倒数第k个节点至尾节点的全部节点 如果该链表长度小于k,请返回一个长度为 0 的链表举一反三: 学习完本题的思路你可以解决如下题目: BM4.合并有序链表 BM5.合并k个已排序的链表 BM…

打造专属任务管理利器:智慧工具私有化部署策略与实践

智慧任务管理工具私有化是指将智慧任务管理工具部署在组织内部的私有服务器或云环境中,以确保数据的安全性、隐私性和完全控制权。以下是对智慧任务管理工具私有化的详细解析: 一、私有化的优势 ● 数据安全:私有化部署确保所有数据存储在组织内部的服务器或私有云中,避免数…

牛客题解 | 设计LFU缓存结构

牛客输入输出题单题解题目 题目链接 题目的主要信息:实现LFU的set与get函数,且复杂度为\(O(1)\) 每次调用这两个函数会给一个频率赋值,超出长度则移除频率最少的,若有频率相同,则移除访问时间最早的举一反三: 学习完本题的思路你可以解决如下题目: BM100. 设计LRU缓存结…

牛客题解 | 设计LRU缓存结构

牛客输入输出题单题解题目 题目链接 题目的主要信息:实现LRU缓存的模拟结构,包括加入函数set,访问函数get 结构有长度限制,加入新数时,超出长度则需要删除最不常访问的,其中set与get都访问 两个函数都是\(O(1)\)举一反三: 学习完本题的思路你可以解决如下题目: BM101. …

牛客题解 | 编辑距离(一)

牛客输入输出题单题解题目 题目链接 题目主要信息:给定两个长度可能不同的字符串,可以对第一个字符串增删改字符 求增删改的最少次数,让第一个字符串变成第二个字符串 字符串中只出现大小写字母举一反三: 学习完本题的思路你可以解决如下题目: BM65 最长公共子序列(二) BM6…

网上学习导航

推荐一个网上学习好玩的地方 学吧导航 网站截图

解决 windows 安装centos7虚拟机 每隔一段时间 虚拟机ip会变动 怎么固定他的ip

查看当前虚拟机的ip地址:我的是192.168.217.136然后获取到网关ip:打开 VMware Workstation,选中你要设置的虚拟机,点击 “编辑” -> “编辑虚拟机设置”。通过ipconfig 可以看到我的是ens160 我的文件就是 ifcfg-ens160 ,然后使用以下命令进行操作sudo nano /etc/sysco…

牛客题解 | 求二叉树的层序遍历

牛客输入输出题单题解题目 题目链接 题目的主要信息:将给定二叉树按行从上到下、从左到右的顺序输出 输出到一个二维数组中,数组中每行就是二叉树的一层举一反三: 学习完本题的思路你可以解决如下题目: BM27. 按之字形顺序打印二叉树 BM35. 判断是否是完全二叉树 方法一:非…

牛客题解 | 没有重复项数字的全排列

牛客输入输出题单题解题目 题目链接 题目主要信息:给定一个数组,求这组数字的全排列 数组无重复元素 以数字在数组中的位置靠前为优先级,按字典序排列输出举一反三: 学习完本题的思路你可以解决如下题目: BM56. 有重复项数字的全排列 BM58. 字符串的排列 BM60. 括号生成 递…

牛客题解 | 最长无重复子数组

牛客输入输出题单题解题目 题目链接 题目主要信息:题目给定一个数组,要找到其中最长的无重复的子数组的长度 子数组必须是数组中连续的一段举一反三: 学习完本题的思路你可以解决如下题目: BM90. 最小覆盖子串 方法:滑动窗口(推荐使用) 知识点1:滑动窗口 滑动窗口是指在数…

牛客题解 | 最长的括号子串

牛客输入输出题单题解题目 题目链接 题目主要信息:一个长度为\(n\)的仅包含左右括号的字符串 计算最长的格式正确的括号子串的长度举一反三: 学习完本题的思路你可以解决如下题目: BM65 最长公共子序列(二) BM66.最长公共子串 BM71.最长上升子序列(一) BM73 最长回文子串 BM…

牛客题解 | 最长公共前缀

牛客输入输出题单题解题目 题目链接 题目主要信息:给定一个字符串数组,其中有n个字符串,求所有字符串的最长公共前缀 公共前缀是指所有字符串都共有的前面部分的子串,从第一个字符开始举一反三: 学会了本题的思路,你将可以解决类似的字符串问题: BM83. 字符串变形 BM85. …