首尾相接数组求子数组最大和
一、题目及要求:
返回一个整数数组中最大子数组的和
如果数组A[0]...A[j-1]首尾相邻,允许A[i-1]...A[n-1],A[0]...A[j-1]之和最大;同时返回最大子数组的位置。
二、设计思路:
对于这题本想延用一维数组的方法,不过由于数组进行了整合,始末位置无法判断。所以此种方法断然没有实现。
小伙伴曾说延用课上学生提供的方法,形成一个固定长度的窗口,依次相加比较。这不失为一个好方法。只可惜时间复杂度不是n。
于是上网查了点资料。思想有点引用网上的了。首先将为两种情况,一种是跨越a[n-1],a[0]的。一种是没有跨越的。
对于没有跨越的,方法很多。对于跨零点的,则可以转换成求其子数组最小和。由于数组总和确定。对于中间那段必定为最小和。总和减最小和求出最大和。对于两个最大和进行比较。得到最终结果。
三、代码
/*王童博 燕亚峰*/ #include<iostream.h> #include<stdlib.h> struct ret {int max,start,end; //用于存放最大值,及始末位置 };struct ret max2(int arry[],int length) //跨越arry[n-1]、arry[0]的最大和 {int total=0;int start1=0;int start2; //起始位置int end=0;int sum=arry[0];int minsum=arry[0];for(int i=1;i<length;i++){if(sum>0){sum=arry[i];start1=i;}else{sum=sum+arry[i];}if(minsum>=sum){minsum=sum;end=i;start2=start1;}total=total+arry[i];}total=total+arry[0];minsum=total-minsum;struct ret ret1={minsum,start2,end};return ret1; }struct ret max1(int arry[],int length) //不跨越零点的最大和 {int start1=0;int start2; //起始位置int end=0;int sum=arry[0];int maxsum=arry[0];for(int i=1;i<length;i++) //求出相邻数组最小和 {if(sum<0){sum=arry[i];start1=i;}else{sum=sum+arry[i];}if(maxsum<=sum){start2=start1;end=i;maxsum=sum;}}struct ret ret1={maxsum,start2,end};return ret1; }int main() {srand((unsigned)time(0));int N;cout<<"输入元素个数:";cin>>N;int a[20];for(int i=0;i<N;i++){a[i]=rand()%20-10;cout<<a[i]<<" ";}cout<<endl;struct ret w=max2(a,N); //调用max2函数,求跨越零点的最值struct ret q=max1(a,N);if(w.max>q.max){cout<<"最大和为:"<<w.max<<"起始位置:"<<w.end+1<<"结束位置:"<<w.start-1;}else{cout<<"最大和为:"<<q.max<<"起始位置:"<<q.start<<"结束位置:"<<q.end;}return 0; }
四、截图
五、实验总结
对于本次实验还是颇有感悟的,对于有些东西不能过于复杂化。像上次一维数组就可以很简单的解决。但自己却化蛇添足。多了几处不需要的代码。不过也是对自己思想的一种实现。
这次实验有点借用网上的了。从反方向入手,不失为一种很好的方法,让我想起TED中的一段演讲,凡事都要考虑反面,美国人在日本问街道的名称,得到的回答却是某某街区和某某街区。因为街道是没有命名的。
对于思路已在思路方面详细阐述了。在这里仅说反向考虑这种思想。
无论什么方面的事情,似乎都需要双方向考虑。
最后不得不附上努力思考的疲劳状:
转载于:https://www.cnblogs.com/wang321/p/4378705.html
首尾相接数组求子数组最大和相关推荐
- 三种算法求解一个数组的子数组最大和
题目:要求一个数组连续下标和的最大值,数组的元素可正.可负.可为零,例如-2,5,3,-6,4,-8,6将返回8. 这题是很经典的一道面试题,也有各种解法,从算法分析上,时间复杂度也有很大差别,下面我 ...
- 二维数组求子数组中最大的和
上次的课堂编程题目是一维数组中子数组的和,现在难度加大了不少,二维数组需要考虑的方面很多,这个程序我是在上个课堂题目基础上加以改善完成的,核心代码如下: int maxSubArray(int a[] ...
- php取数组中连续数,PHP实现求连续子数组最大和问题2种解决方法
本文实例讲述了PHP实现求连续子数组最大和问题2种解决方法.分享给大家供大家参考,具体如下: 问题描述 求子数组的最大和 题目描述: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整 ...
- 算法 求子数组的最大和 C
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! //** ...
- 练习系列 - 5、求子数组的最大和
/*! \author LiuBao \date 2011/3/24 \brief 求子数组的最大和 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有 ...
- 求子数组的最大和要求O(n)
//求子数组的最大和 //输入一个整形数组.有整数也有负数,数组中连续一个或多个子数组,每一个子数组都有一个和,求全部子数组的和的最大值,要求时间复杂度O(n) #include<iostrea ...
- 微软面试题系列(三):求子数组的最大和
题目大意: 输入一个×××数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为 O(n). 例如输入的数组为 1, ...
- 编程之美 2.14求数组的子数组之和的最大值
对于一个有N个元素的数组,a[0]~a[n-1],求子数组最大值. 如:数组A[] = [−2, 1, −3, 4, −1, 2, 1, −5, 4],则连续的子序列[4,−1,2,1]有最大的和6. ...
- Programe_Of_Beauty:2.14 求数组的子数组之和的最大值
问题:一个有N个整数元素的一维数组,那么求子数组和的最大值. 分析:首先我们明确问题,子数组是联系的,不用返回元素的位置,元素是整数,可能为正,负或0.我们来看看最经典的解法:a[0],a[1]-a[ ...
最新文章
- 如何解决Git中的合并冲突
- 线程模型、pthread 系列函数 和 简单多线程服务器端程序
- Matlab图像处理创新实践-实验3【图像锐化】
- PAT 1152 Google Recruitment (20 分)- 甲级
- PyTorch学习(7)-Seq2Seq与 Attention
- [转] android学习和广告平台赚钱
- html 移动app开发
- 徘徊于斗牛之间 —— 星象、星宿与星座(风水)
- Spark:聚类算法
- SQL Fundamentals || DCL(Data Control Language) || 用户管理Profile概要文件
- Ajax与jQuery异步加载数据
- java随机取数组_java基础自动数组(获取随机数组的最大数和最小数)
- JS学习之路系列总结二阴阳阵(此文犹如武林之中的易筋经,是你驰骋IT界的武功心法,学会JS五大阵法就学会了JS,博主建议先学三才阵)
- 华为数通笔记-MPLS BGP跨域
- 在你们眼中,杭州和苏州都是江南名城,有什么区别?
- 王者荣耀告诉你什么是节流
- (一)走进Linux世界(安装Centos8,初始化生产环境,GNU bash)
- Oracle报ORA-00942: 表或视图不存在的解决方法
- Javascript与多线程
- js JSON.parse和JSON.stringify
热门文章
- 自己写一个java.lang.reflect.Proxy代理的实现
- Uva 11178 Morley定理
- 编译hibernate源代码
- datagridview控件的使用
- C语言大写字母E转小写e,C语言 大小写字母转换
- java httpclient form_Java后台使用httpclient入门HttpPost请求(form表单提交,File文件上传和传输Json数据)...
- git 代码回滚_git代码版本管理(1)——git版本回滚
- 谷歌浏览器主页_谷歌浏览器客服人工服务电话怎样查询-客服人工服务电话查询方法...
- android git项目管理,Android Studio中如何使用Git和Github来管理项目
- (34)VHDL实现T触发器