问题:给出一个数组,元素有正有负,数组中连续的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.求子数组的最大和相关推荐

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

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

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

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

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

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

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

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

  5. 程序员面试题100题第03题——求子数组的最大和

    题目:输入一个整型数组,数组里有整数也有负数.数组中连续的一个或者多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值. 要求时间复杂度为O(n). 分析: 方法一: 当我们加上一个 ...

  6. 程序员面试100题之九:求子数组的最大和

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

  7. 【算法07】求子数组的最大和

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

  8. python求子集_【算法07】求子数组的最大和

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

  9. 面试题31.连续子数组的最大和

    题目:输入一个整型数组,数组里有正数也有负数.数组中一个或者连续多个整数组成一个子数组. 求所有子数组的和的最大值.要求时间复杂度O(n) 本题可以把所有子数组全部找出来再求其和的最大值便可以得出,但 ...

  10. 【IT笔试面试题整理】连续子数组的最大和

    [试题描述]输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组. 求所有子数组的和的最大值.要求时间复杂度O(n). 思路:当我们加上一个正数时,和会增加:当我们加上一个 ...

最新文章

  1. VLAN,trunk,以太网通道
  2. 强化学习note2——value iteration和policy iteration的区别,MC和TD的区别
  3. SAP 物料清单 BOM
  4. MFC入门(一)——MFC是一个编程框架
  5. ubuntu之间传文件
  6. proc_fs文件的操作
  7. 可以使用C#语言的在线ACM题库
  8. AI Studio 数据集
  9. CentOS 7 搭建企业内网 DNS 服务器
  10. F.conv2d实现代码
  11. 一文看懂GPIO口的八种工作原理
  12. 蓝桥杯练习题(数列排序)
  13. python you-get 下载视频
  14. [励志][经验]《异类》 -- 格拉德威尔(美)
  15. 霹雳吧啦Wz语义分割学习笔记P2
  16. 关于支持电脑登录选项设置
  17. NS2网络仿真的过程
  18. SRS流媒体服务器——服务器读取RTMP推流数据
  19. 线上抓娃娃方案的选型方法
  20. 基本上都是基本语言知识

热门文章

  1. MatchSum - 一种基于语义匹配的抽取式摘要框架
  2. 赛尔笔记 | 对比学习简述
  3. seaborn—sns.heatmap绘制热力图
  4. 文本生成解码策略笔记-常见解码策略
  5. LeetCode刷题——91. 解码方法
  6. Python字符串中常用的方法
  7. 实践出真知--ZAC《网络营销实战密码》
  8. 二十一天学通JavaScript:cookie的编码
  9. Django项目实践4 - Django站点管理(后台管理员)
  10. appscan无法连接到服务器_和平精英无法连接到服务器是怎么回事 最新解决方案...