3.求子数组的最大和
问题:给出一个数组,元素有正有负,数组中连续的1个或者多个数组成1个子数组,每个子数组有1个和,求所有子数组和值的最大值,时间复杂度为O(n)
解: 一:可以用穷举的方法求出这个最大值,只是时间复杂度是O(n^3),这中方法的代码如下
int dphe(int a[],int len) {int i,j;int **he=new int*[len];for(i=0;i<len;i++)*(he+i)=new int[len]();for(i=0;i<len;i++)for(j=0;j<len;j++)he[i][j]=0;int length;for(length=0;length<len;length++)for(i=0;i<len-length;i++)for(j=i;j<=i+length;j++)he[i][i+length]+=a[j];int max=INT_MIN;for(i=0;i<len;i++)for(j=0;j<len;j++)if(he[i][j]>=max)max=he[i][j];for(i=0;i<len;i++)delete [] *(he+i);delete he;return max; }
这中方法没什么技巧,穷举所有的值。
二: 观察数组可以发现,因为是要求连续的元素组成子数组,假设给定的数组是A[1,N],最后假设和最大的子数组是A[p,q],其中1<=p<=q<=N,那么我们可以得到,A[1,p-1]这个子数组的和一定是负值,否则A[1,p-1]+A[p,q]>A[p,q]就不满足A[p,q]是子数组最大的了。所以,我们可以对A进行遍历,当遇到子数组的和是负值时,就可以抛弃整个子数组了,同时要记下前面子数组的最大值,下面是用栈写的,规则如下
1。每个元素顺序入栈,设置2个变量sum和max,sum记录在栈中的元素的总和,max记录到目前元素为止最大的子数组的和
2。元素入栈后计算sum,若sum<0,则栈中元素全部出栈;若sum>0,则将sum和max对比,若sum>max,则更新max,否则max不变,
代码如下,测试部分随即生成元素,并和穷举法的结果比较,最后结果都一样。
/*求子数组的和,现用DP做*/#include<iostream> #include<climits> #include<cstdlib> #include<time.h> using namespace std;int dphe(int a[],int len) {int i,j;int **he=new int*[len];for(i=0;i<len;i++)*(he+i)=new int[len]();for(i=0;i<len;i++)for(j=0;j<len;j++)he[i][j]=0;int length;for(length=0;length<len;length++)for(i=0;i<len-length;i++)for(j=i;j<=i+length;j++)he[i][i+length]+=a[j];int max=INT_MIN;for(i=0;i<len;i++)for(j=0;j<len;j++)if(he[i][j]>=max)max=he[i][j];for(i=0;i<len;i++)delete [] *(he+i);delete he;return max; }/*下面用栈做,规则如下1.元素顺序入栈,保存2个变量sum和max,sum代表整个栈中元素的总和,sum代表到目前元素为止前面最大的子数组的和2.若sum<0,则清空整个栈3.若sum>max,则更新sum */typedef int DataType; #define MAX 100 typedef struct {DataType data[MAX];int top; }Stack;Stack* init_stack(void) {Stack* s=new Stack;if(s)s->top=-1;return s; }bool empty_stack(Stack* s) {if(s->top==-1)return true;return false; }bool full_stack(Stack* s) {if(s->top==MAX-1)return true;return false; }void push_stack(Stack* s,DataType value) {if(full_stack(s)) return ;s->top++;s->data[s->top]=value; }void pop_stack(Stack* s,DataType *value) {if(empty_stack(s))return ;*value=s->data[s->top];s->top--; }void clear_stack(Stack* s) {int value;while(!empty_stack(s))pop_stack(s,&value); }void free_stack(Stack* s) {delete s; }int he(int a[],int length) {int i;Stack* s;int sum=0,max=INT_MIN;s=init_stack();for(i=0;i<length;i++){push_stack(s,a[i]);sum=sum+a[i];if(sum<=0){clear_stack(s);sum=0;}else // sum>0 {if(sum>max)max=sum;}}return max;free_stack(s); } int main(void) {int b[]={3,-5,2,-4,7,-2,10,1};int c[]={-1,0,2,-1,0,4,2,-1};int a[8];int i,j;//比较10次for(j=1;j<=10;j++){srand(time(NULL));for(i=0;i<8;i++)a[i]=rand()%200-100; //随即产生-100-100的数for(i=0;i<8;i++)cout<<a[i]<<" ";cout<<"穷举和="<<dphe(a,8)<<" ";cout<<"栈和="<<he(a,8)<<endl;sleep(1);}return 0; }
三: 可以对上面代码进行精简,不用栈,对数组遍历就行。代码如下
int he2(int a[],int length) {int i,j;int sum=0,max=INT_MIN;for(i=0;i<length;i++){sum+=a[i];if(sum<=0)sum=0;else if(sum>max)max=sum; }return max; }
同样可以测试,结果于上面2种一样。
转载于:https://www.cnblogs.com/buxianghe/p/3199520.html
3.求子数组的最大和相关推荐
- 算法 求子数组的最大和 C
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! //** ...
- 练习系列 - 5、求子数组的最大和
/*! \author LiuBao \date 2011/3/24 \brief 求子数组的最大和 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有 ...
- 求子数组的最大和要求O(n)
//求子数组的最大和 //输入一个整形数组.有整数也有负数,数组中连续一个或多个子数组,每一个子数组都有一个和,求全部子数组的和的最大值,要求时间复杂度O(n) #include<iostrea ...
- 微软面试题系列(三):求子数组的最大和
题目大意: 输入一个×××数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为 O(n). 例如输入的数组为 1, ...
- 程序员面试题100题第03题——求子数组的最大和
题目:输入一个整型数组,数组里有整数也有负数.数组中连续的一个或者多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值. 要求时间复杂度为O(n). 分析: 方法一: 当我们加上一个 ...
- 程序员面试100题之九:求子数组的最大和
题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). 例如输入的数组为1, -2, 3, ...
- 【算法07】求子数组的最大和
题目:输入一个整型数组,数组里面有正数也有负数,数组中的连续一个或者多个整数组成一个子数组,每一个子数组都有一个和,求所有子数组和的最大值.要求时间复杂度为O(n). 例如:输入数组为{1,-2,3, ...
- python求子集_【算法07】求子数组的最大和
题目:输入一个整型数组,数组里面有正数也有负数,数组中的连续一个或者多个整数组成一个子数组,每一个子数组都有一个和,求所有子数组和的最大值.要求时间复杂度为O(n). 例如:输入数组为{1,-2,3, ...
- 面试题31.连续子数组的最大和
题目:输入一个整型数组,数组里有正数也有负数.数组中一个或者连续多个整数组成一个子数组. 求所有子数组的和的最大值.要求时间复杂度O(n) 本题可以把所有子数组全部找出来再求其和的最大值便可以得出,但 ...
- 【IT笔试面试题整理】连续子数组的最大和
[试题描述]输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组. 求所有子数组的和的最大值.要求时间复杂度O(n). 思路:当我们加上一个正数时,和会增加:当我们加上一个 ...
最新文章
- VLAN,trunk,以太网通道
- 强化学习note2——value iteration和policy iteration的区别,MC和TD的区别
- SAP 物料清单 BOM
- MFC入门(一)——MFC是一个编程框架
- ubuntu之间传文件
- proc_fs文件的操作
- 可以使用C#语言的在线ACM题库
- AI Studio 数据集
- CentOS 7 搭建企业内网 DNS 服务器
- F.conv2d实现代码
- 一文看懂GPIO口的八种工作原理
- 蓝桥杯练习题(数列排序)
- python you-get 下载视频
- [励志][经验]《异类》 -- 格拉德威尔(美)
- 霹雳吧啦Wz语义分割学习笔记P2
- 关于支持电脑登录选项设置
- NS2网络仿真的过程
- SRS流媒体服务器——服务器读取RTMP推流数据
- 线上抓娃娃方案的选型方法
- 基本上都是基本语言知识
热门文章
- MatchSum - 一种基于语义匹配的抽取式摘要框架
- 赛尔笔记 | 对比学习简述
- seaborn—sns.heatmap绘制热力图
- 文本生成解码策略笔记-常见解码策略
- LeetCode刷题——91. 解码方法
- Python字符串中常用的方法
- 实践出真知--ZAC《网络营销实战密码》
- 二十一天学通JavaScript:cookie的编码
- Django项目实践4 - Django站点管理(后台管理员)
- appscan无法连接到服务器_和平精英无法连接到服务器是怎么回事 最新解决方案...