一、题目及要求:

返回一个整数数组中最大子数组的和

如果数组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

首尾相接数组求子数组最大和相关推荐

  1. 三种算法求解一个数组的子数组最大和

    题目:要求一个数组连续下标和的最大值,数组的元素可正.可负.可为零,例如-2,5,3,-6,4,-8,6将返回8. 这题是很经典的一道面试题,也有各种解法,从算法分析上,时间复杂度也有很大差别,下面我 ...

  2. 二维数组求子数组中最大的和

    上次的课堂编程题目是一维数组中子数组的和,现在难度加大了不少,二维数组需要考虑的方面很多,这个程序我是在上个课堂题目基础上加以改善完成的,核心代码如下: int maxSubArray(int a[] ...

  3. php取数组中连续数,PHP实现求连续子数组最大和问题2种解决方法

    本文实例讲述了PHP实现求连续子数组最大和问题2种解决方法.分享给大家供大家参考,具体如下: 问题描述 求子数组的最大和 题目描述: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整 ...

  4. 算法 求子数组的最大和 C

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! //** ...

  5. 练习系列 - 5、求子数组的最大和

    /*! \author LiuBao \date 2011/3/24 \brief 求子数组的最大和 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有 ...

  6. 求子数组的最大和要求O(n)

    //求子数组的最大和 //输入一个整形数组.有整数也有负数,数组中连续一个或多个子数组,每一个子数组都有一个和,求全部子数组的和的最大值,要求时间复杂度O(n) #include<iostrea ...

  7. 微软面试题系列(三):求子数组的最大和

    题目大意: 输入一个×××数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为 O(n). 例如输入的数组为 1, ...

  8. 编程之美 2.14求数组的子数组之和的最大值

    对于一个有N个元素的数组,a[0]~a[n-1],求子数组最大值. 如:数组A[] = [−2, 1, −3, 4, −1, 2, 1, −5, 4],则连续的子序列[4,−1,2,1]有最大的和6. ...

  9. Programe_Of_Beauty:2.14 求数组的子数组之和的最大值

    问题:一个有N个整数元素的一维数组,那么求子数组和的最大值. 分析:首先我们明确问题,子数组是联系的,不用返回元素的位置,元素是整数,可能为正,负或0.我们来看看最经典的解法:a[0],a[1]-a[ ...

最新文章

  1. 如何解决Git中的合并冲突
  2. 线程模型、pthread 系列函数 和 简单多线程服务器端程序
  3. Matlab图像处理创新实践-实验3【图像锐化】
  4. PAT 1152 Google Recruitment (20 分)- 甲级
  5. PyTorch学习(7)-Seq2Seq与 Attention
  6. [转] android学习和广告平台赚钱
  7. html 移动app开发
  8. 徘徊于斗牛之间 —— 星象、星宿与星座(风水)
  9. Spark:聚类算法
  10. SQL Fundamentals || DCL(Data Control Language) || 用户管理Profile概要文件
  11. Ajax与jQuery异步加载数据
  12. java随机取数组_java基础自动数组(获取随机数组的最大数和最小数)
  13. JS学习之路系列总结二阴阳阵(此文犹如武林之中的易筋经,是你驰骋IT界的武功心法,学会JS五大阵法就学会了JS,博主建议先学三才阵)
  14. 华为数通笔记-MPLS BGP跨域
  15. 在你们眼中,杭州和苏州都是江南名城,有什么区别?
  16. 王者荣耀告诉你什么是节流
  17. (一)走进Linux世界(安装Centos8,初始化生产环境,GNU bash)
  18. Oracle报ORA-00942: 表或视图不存在的解决方法
  19. Javascript与多线程
  20. js JSON.parse和JSON.stringify

热门文章

  1. 自己写一个java.lang.reflect.Proxy代理的实现
  2. Uva 11178 Morley定理
  3. 编译hibernate源代码
  4. datagridview控件的使用
  5. C语言大写字母E转小写e,C语言 大小写字母转换
  6. java httpclient form_Java后台使用httpclient入门HttpPost请求(form表单提交,File文件上传和传输Json数据)...
  7. git 代码回滚_git代码版本管理(1)——git版本回滚
  8. 谷歌浏览器主页_谷歌浏览器客服人工服务电话怎样查询-客服人工服务电话查询方法...
  9. android git项目管理,Android Studio中如何使用Git和Github来管理项目
  10. (34)VHDL实现T触发器