首尾相连一维数组最大子数组(一)
一.题目
返回一个整数数组中最大子数组的和
二.要求
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。 同时返回最大子数组的位置。
求所有子数组的和的最大值。要求时间复杂度为O(n)
三.代码
#include <iostream> #define N 1000 using namespace std; int main () { int a[N],n; int sum,max; int begin,last; int i,j,t,k; char status = 'y'; while(status == 'Y' || status == 'y') { cout<<"请输入数组长度n:"<<endl; cin>>n; cout<<"请输入"<<n<<"个数:"<<endl; for (i=0; i<n; i++) { cin>>a[i]; }
//初始化 begin = 0; last = 0; max = 0; for (i=0; i<n; i++) { sum = 0; for (j=i; j<n; j++) { sum += a[j]; if ( sum > max ) { max = sum; begin = i; last = j; } }
for(k=0; k<i; k++) { sum += a[k]; if ( sum > max ) { max = sum; begin=i; last = k; } } } cout<<"最大子数组之和为:"<<endl; cout<<max<<endl; cout<<"最大子数组序列为:"<<endl;
//当最大子数组出现在首尾相接的情况下 if ( last < begin) { for (i=begin; i<n; i++) { cout<<a[i]<<" "; } for (i=0; i<=last; i++) { cout<<a[i]<<" "; } cout<<endl; } else { for (i=begin; i<=last; i++) { cout<<a[i]<<" "; } cout<<endl; } cout<<endl; cout<<"是否继续(是输入y或Y,否输入n或N):"<<endl; cin>>status; } return 0; }
刚开始只是考虑了当i=n-1时进行首尾相连的情况,把k的循环放在了外面,只是从i=n-1的时候才开始尾接首从i=0计算最大子数组
感悟:
当然在第一遍写完程序的时候不仅仅是没有对max、begin、last进行初始化的问题,都是一些小问题,很容易忽视。但是就是这些小问题导致输出结果错误,在编程的世界里不允许有任何的疏忽出现。所以在以后的编程过程中不仅仅要做到认真还要做到考虑周全
还待完善:时间复杂度为O(n^2)
四.测试用例截图
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理