当前位置: 首页 > news >正文

最大连续子列和

给定一个数组,求它的最大连续子列和。

这个问题有四种解法。

1、暴力循环(O(n^3))

分析这个问题,既然是子列,那么它最长为n,最短为1。要想求和我们一般需要知道这个子列的左端下标和右端下标,再求这个子列的和。最简单的办法就是用暴力循环来求和。

首先我们需要定义左端下标i,每次循环i++。接下来是右端下标j,j的初值为i,因为右端下标总是大于等于左端下标,每次循环j++。知道了左端下标i和右端下标j之后,再从i到j循环求和就行了。

#include <iostream>
#include <algorithm>using namespace std;const int N=1*10^6;int main()
{int n;cin>>n;int a[N];int sum=0,maxsum=0;for(int i=0;i<n;i++) cin>>a[i];for(int i=0;i<n;i++){for(int j=i;j<n;j++){sum=0;for(int k=i;k<=j;k++) sum+=a[k];if(sum>maxsum) maxsum=sum;}}cout<<maxsum;return 0;
} 

2、暴力循环的改进(O(n^2))

第一种算法显然时间复杂度太高了,可以进行改进,减少一层循环。

当左端下标i和右端下标j确定时,知道a[i]~a[j]的和,如果要求a[i]~a[j+1],按照第一种算法,需要重新遍历一遍a[i]~a[j]的数组,再把a[j+1]加上。思考后,我们发现,如果已知a[i]~a[j]的和sum,我们只需要让sum+a[j+1]就可以得到a[i]~a[[j+1]的和。因此我们就可以使用两层循环就可以解决这个问题。

#include <iostream>
#include <algorithm>using namespace std;const int N=1*10^6;int main()
{int n;cin>>n;int a[N];int sum=0,maxsum=0;for(int i=0;i<n;i++) cin>>a[i];for(int i=0;i<n;i++){sum=0;for(int j=i;j<n;j++){sum+=a[j];if(sum>maxsum) maxsum=sum;}}cout<<maxsum;return 0;
}

值得注意的是,第一个算法中sum重置为0是在第二个循环里,第二个sum重置为0是在第一层循环里。原因是第一个算法的第三层循环是循环累加求值,所以每次循环前要重置为0,而第二个算法简化后,左端i确定后,利用累加的方法记录以左端i为首长度为1~n-i+1的各子列的和,所以在第一重循环确定新的左端i后,就要重置sum。

3、分治(O(n*logn))

当我们看到一个算法的时间复杂度是O(n^2)的时候,我们就可以思考这个算法能不能经过改进将时间复杂度降为O(n*logn)

这个问题也可以用分治的方法来解决。(有时候想想这些算法题真操蛋,万物可分治可二分可递归了^_^)

分治是将大的问题划分成小的问题,最后整合结果的方法。分是划分,治是整合结果。

怎么分治呢?我们考虑到,把整个数列从中间切开,最大子列和=max(左边数列最大子列和,右边数列子列和,跨越边界的子列和),跨越边界的子列和就是左右两边的数都包含的情况。利用这个办法,不断地将子列切片,进行分治,最终就能求得整个数列的最大子列和。

代码有点复杂,回头有空再写吧^_^

4、在线处理!(O(n))!

这是对于最大子列和最好最快的算法。

这个算法的思想是,从左到右累加每个数得到sum,如果sum>maxsum,更新maxsum=sum,如果sum<0,将sum重置为0。输出最后的sum值。

为什么这个算法是正确的呢?如果任意一个子列和小于0,那么这个子列一定不会位于和最大子列的左侧,因为一个负数对于整个数列的和是没有贡献的。

#include <iostream>
#include <algorithm>using namespace std;const int N=1*10^6;int main()
{int n;cin>>n;int a[N];int sum=0,maxsum=-1*10^6;for(int i=0;i<n;i++){cin>>a[i];sum+=a[i];if(sum<0) sum=0;if(sum>maxsum) maxsum=sum;}cout<<maxsum;return 0;
}

为什么,我把maxsum设为负数呢,因为有的算法题给的数据实在变态,你必须考虑符合题意的每一种极端情况。把maxusm设置为负数,我是考虑到,只有一个元素且为负数的情况。

为什么它叫在线处理呢?因为它可以边输入边计算,只需要一个循环。而算法复杂度只能这么小了,毕竟输入数据的算法也需要O(n)。

这四种算法思想均来自中国大学mooc陈越老师的数据结构课。

md,真爽,还有啥比ac更爽的?!纠结这么久终于找到bug,解决这道题了。 

相关文章:

最大连续子列和

给定一个数组&#xff0c;求它的最大连续子列和。这个问题有四种解法。 1、暴力循环(O(n^3))分析这个问题&#xff0c;既然是子列&#xff0c;那么它最长为n&#xff0c;最短为1。要想求和我们一般需要知道这个子列的左端下标和右端下标&#xff0c;再求这个子列的和。最简单的…...

线性基 学习笔记

什么是线性基&#xff1f; 先来回顾一下向量空间中的基。这个基代表着空间的一个极大线性无关子集&#xff0c;组中向量线性无关&#xff0c;且空间中的任意一个向量都可以唯一地由基中的向量来表示 那么回到线性基&#xff0c;它其实就类似于是一个向量空间的基 我们考虑一…...

算法-回溯算法-组合问题

77. 组合https://leetcode.cn/problems/combinations/ 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,…...

ABAP中的Null值与space 以及 BW中ADSO的Key值

写出来怪丢人&#xff0c;到现在还没搞懂这个。 在BW中创建ADSO&#xff0c;定义Key字段。可以看到ADSO表的定义中&#xff0c;所有的Key和Data属性如下&#xff1a; 所有的key会有关键字key打头&#xff0c;所有字段都有not null. 但是并不是有个字段是blank空的就不能更新进…...

JavaScript库之Lodash常用方法

Lodash 中文文档https://www.lodashjs.com/docs/lodash.omit/以下总结了在项目中常用的方法&#xff0c;其他的慢慢更新语言&#xff1a;cloneDeep这个方法类似_.clone&#xff0c;除了它会递归拷贝 value。&#xff08;注&#xff1a;也叫深拷贝&#xff09;参数value (*): 要…...

Kotlin新手教程二(Kotlin基本数据类型及基础语法)

一、基本数据类型 1.数字 由于Kotlin支持类型推断&#xff0c;所以在使用时若超出Int的范围则会被认定为其它类型&#xff1b;若需要显式指定Long型值&#xff0c;则需要在值后添加L后缀。 2.浮点数 3.比较两个数&#xff08; 和 &#xff09; Kotlin 中没有基础数据类型&a…...

git idea创建新分支,获取/合并主支代码的2个方法

其他sql格式也在更新中&#xff0c;可直接查看这个系列&#xff0c;要是没有你需要的格式&#xff0c;可在评论或私信我 个人目录 获取主支代码的2个方法1&#xff0c;创建一个分支&#xff0c;获取主支的所有代码&#xff08;场景&#xff1a;我需要一个自己的分支进行编写模…...

CF1714A Everyone Loves to Sleep 题解

CF1714A Everyone Loves to Sleep 题解题目链接字面描述题面翻译题目描述输入格式输出格式样例解释题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1代码实现题目 链接 https://www.luogu.com.cn/problem/CF1714A 字面描述 题面翻译 题目描述 Vlad和其他人一样&am…...

oracle官方下载历史版本JDK版本

背景 日常工作中由于一些特殊原因&#xff0c;我们需要下载指定系统指定位数指定版本的jdk&#xff0c;这个时候去网上搜索下载就会遇到各种坑&#xff0c;病毒、诱导连接、诱导关注/注册、付费、错误版本等&#xff0c;所以最好的办法是去官网下载&#xff0c;下面列举两种方式…...

双击-jar包无法运行解决方法

我自己是通过探索出来的方法解决的&#xff0c;网上的方法适合普通问题 网络流传方法 那种-jar和run.bat的就是曲解了问题意思&#xff0c;问题不是如何运行&#xff0c;而是如何双击jar包就可以直接运行。 普通小问题就是修改注册表&#xff0c;将java路径写进去后面加个 %1…...

程序员的自我修养第七章——动态链接 (下)

接上一篇。 7.3 地址无关代码 对于现代机器来说&#xff0c;引入地址无关代码并不麻烦&#xff0c;我们展示下各种模型的地址引用方式&#xff1a; 1. 模块内部函数调用 2. 模块内部的数据访问&#xff0c;如全局变量、静态变量。 3. 模块外部的函数调用&#xff0c;跳转。 4.…...

蓝桥杯刷题——基础篇(二)

这部分题目&#xff0c;主要面向有志参加ACM与蓝桥杯竞赛的同学而准备的&#xff0c;蓝桥杯与ACM考察内容甚至评测标准基本都一样&#xff0c;因此本训练计划提供完整的刷题顺序&#xff0c;循序渐进&#xff0c;提高代码量&#xff0c;巩固基础。因竞赛支持C语言、C、Java甚至…...

PTA L1-049 天梯赛座位分配(详解)

前言&#xff1a;内容包括&#xff1a;题目&#xff0c;代码实现&#xff0c;大致思路&#xff0c;代码解读 题目&#xff1a; 天梯赛每年有大量参赛队员&#xff0c;要保证同一所学校的所有队员都不能相邻&#xff0c;分配座位就成为一件比较麻烦的事情。为此我们制定如下策…...

Linux部分参数作用讲解

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…...

Java kafka

JAVA面试题--Kafka&#xff08;最新最全&#xff09; 目录概述需求&#xff1a;设计思路实现思路分析1.URL管理2.网页下载器3.爬虫调度器4.网页解析器5.数据处理器拓展实现性能参数测试&#xff1a;参考资料和推荐阅读)Survive by day and develop by night. talk for import b…...

DBA之路---Stream数据共享同步机制与配置方法

oracle的Stream解析–数据共享 在g版本常用&#xff0c;如果是c版本项目一般都会选择goldengate&#xff0c;比stream靠谱多了 Oracle中的stream是消息队列一种应用形式&#xff0c;原理如下&#xff1a; 收集oracle中的事件&#xff0c;将事件保存在队列里&#xff0c;然后将…...

CF1790E Vlad and a Pair of Numbers 题解

CF1790E Vlad and a Pair of Numbers 题解题目链接字面描述题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1思路代码实现题目 链接 https://www.luogu.com.cn/problem/CF1790E 字面描述 题面翻译 共有 ttt 组数据。 每组数据你会得到一个正整数 xxx&…...

漏洞预警|Apache Kafka Connect JNDI注入漏洞

棱镜七彩安全预警 近日网上有关于开源项目Apache Kafka Connect JNDI注入漏洞&#xff0c;棱镜七彩威胁情报团队第一时间探测到&#xff0c;经分析研判&#xff0c;向全社会发起开源漏洞预警公告&#xff0c;提醒相关安全团队及时响应。 项目介绍 Karaf是Apache旗下的一个开…...

企业小程序开发步骤【教你创建小程序】

随着移动互联网的兴起&#xff0c;微信已经成为了很多企业和商家必备的平台&#xff0c;而其中&#xff0c;微信小程序是一个非常重要的工具。本文将为大家介绍小程序开发步骤&#xff0c;教你创建小程序。 步骤一、注册小程序账号 先准备一个小程序账号&#xff0c;在微信公…...

刚性电路板的特点及与柔性电路板的区别

打开市场上的任何一个电子产品&#xff0c;会发现里面都有一块或多块电路板。电路板是电子产品运行的核心&#xff0c;之前沐渥小编已经给大家介绍了柔性电路板&#xff0c;下面给大家介绍刚性电路板的基础知识。 刚性电路板俗称硬板&#xff0c;是由不容易变形的刚性基材制成的…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...