关键在于把数组分为两个部分a,b。最大的连续和要么在a要么在b,另外还有可能就是跨越a,b的边界,将跨越边界的最大向量称为mc。

一个注意的地方就是mc正在a中的部分包含右边边界的最大子向量,而mc在b中的部分是b中包含左边界的最大子向量。分治算法的时间复杂度是O(nlogn)

#include<iostream>
using namespace std;
int max(int a,int b)
{return a>b?a:b;
}
int max2(int a,int b,int c)
{return max(a,b)>c?max(a,b):c;
}
int maxsum(int a[],int start,int end)
{if(start>end)return 0;//处理有0个元素的情况if(start==end)return a[start];int middle=start+(end-start)/2;int sum=0,lmax=0;for(int i=middle;i>=start;i--)//这里必须从middle往start移动,因为对于跨越边界的最大向量是由左边部分最大的向量与右边最大的向量拼接起来{sum+=a[i];lmax=max(lmax,sum);//求出左边部分的最大和}int rmax=0;sum=0;//注意这里必须把sum还原为0,否则下面计算会出错,而且这里不能再int sum=0,会导致重复定义。for(int i=middle+1;i<=end;i++){sum+=a[i];rmax=max(rmax,sum);}return max2(lmax+rmax,maxsum(a,start,middle),maxsum(a,middle+1,end));
}
int main()
{int a[]={1,-2,3,10,-4,7,2,-5};int length=sizeof(a)/sizeof(int);int result=maxsum(a,0,length-1);cout<<result<<endl;
}

更为简单的方法是使用扫描算法,算法的复杂度是O(n),是线性时间的复杂度。它一趟输入完毕它就计算出了结果,这特别适合处理磁盘文件。同时它一定是最好的算法了。因为任何计算最大子向量的正确算法都必须检测所有n个输入。

编程珠玑第八章——分治算法求解数组中的最大的连续和相关推荐

  1. 编程珠玑第八章——习题10查找数组中总和最接近0的子数组

    内容来自互联网,做了一定修改 方法1: 这个问题和求子数组最大值优点相似,但解法不同,如果按照求子数组最大值的方法来求解,我们可以求出以j为截止的最大值和最小值,如果最大值和最小值都>0,那么最 ...

  2. 分治算法求解列表中第k小的数

    分治算法地思想就是将复杂问题分解为简单的子问题,然后寻求子问题的地归结,并组合各个子问题的解一起得到最终复杂问题的解. 针对求解列表中第k小的数,暴力拆解法可以将列表排序然后根据索引求出列表中第k小的 ...

  3. 计算机基础算法棋盘覆盖,分治算法求解棋盘覆盖问题互动教学过程.doc

    分治算法求解棋盘覆盖问题互动教学过程 分治算法求解棋盘覆盖问题互动教学过程 摘要:针对算法设计与分析课程难度较大.对学生编程能力要求较高的现状,通过对棋盘覆盖问题的分治算法求解过程进行互动教学设计,引 ...

  4. 如何判断数组所有数都不等于一个数_【每日算法Day 91】求解数组中出现次数超过1/3的那个数

    题目链接 LeetCode 229. 求众数 II[1] 题目描述 给定一个大小为 的数组,找出其中所有出现超过 次的元素. 说明: 要求算法的时间复杂度为 ,空间复杂度为 . 示例1 输入: [3, ...

  5. 1145: 零起点学算法52——数组中删数II

    1145: 零起点学算法52--数组中删数II Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lld Submitted: 29 ...

  6. C语言:使用冒泡算法将数组中的数据从大到小进行排序

    /*使用冒泡算法将数组中的数据从大到小进行排序*/ #include<stdio.h> #define N 5 int main() {int a[N];int i,j,t;printf( ...

  7. 算法-寻找数组中的重复值,四种解法

    算法-寻找数组中的重复值 寻找数组中的重复值 寻找数组中的重复值 题目来源于:Leetcode-287.本题归类到简单我无法理解-要满足四个条件需要用很特定的解法,面试中要是用到的话很可能是在给自己挖 ...

  8. Problem C: 零起点学算法82——数组中查找数

    Problem C: 零起点学算法82--数组中查找数 分析 对数据进行遍历判断即可. Description 在给定的数组中查找一个数 Input 多组测试,每组第一行输入1个整数n(n<20 ...

  9. 输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)

    输入一个整型数组,数组里有正数也有负数.数组中的一个或连续多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n).(奇安信-wab前端) 例如,输入的数组为{ 1.-2.3.10. ...

最新文章

  1. 简约而不简单的Django新手图文教程
  2. mac 苹果多版本jdk自由切换
  3. 世安杯CTF writeup
  4. java ibatis 获取执行的sql_小程序官宣+JAVA 三大框架基础面试题
  5. Cheat_Sheet ---Keras、Matlab、Matplotlib、Numpy、Pandas、Scikit-Learn、SciPy
  6. golang定时任务的使用
  7. ELV局部视图与差分隐私【敏感度到底怎么理解】【上】
  8. Object-c 总结之NSArray
  9. python server酱_12306这是肿么了?开售一秒就抢完,如何用Python抢到回家车票?
  10. 基于CentOS7,MySQL5.7的 读写分离
  11. Mongodb 备份 还原 导出 导入 等批量操作
  12. 基于序列标注的信息抽取模型(已申请专利)
  13. c语言程序设计小球弹跳,C语言实现弹跳小球
  14. HTML制作课表源代码
  15. docker容器技术之虚拟化网络概述(四)
  16. 给你的手机加上安全保障,请设置SIM卡PIN码
  17. Failed to download repo mpvue/mpvue-quickstart:tunneling socket co uld not be established
  18. 命令行给Linux安装中文,Linux下命令行安装TeamViewer
  19. [转]跨越千年的RSA算法
  20. crmeb电商系统源码

热门文章

  1. 液晶12864COG 液晶模块串口/并口ST7565R带背3.3v 12864-14显示屏
  2. java反射机制知识_Java反射机制讲解,程序员必须掌握的知识点
  3. hive 语句总结_大数据分析工程师面试集锦4-Hive
  4. java高级特性2,Java高级特性 2
  5. ncbi查找目的基因序列_使用NCBI设计qPCR引物方法
  6. service数据保存_「数据架构」数据流程图与实例-客户服务系统
  7. TCL中关于Cells的一些使用方法?
  8. Windows下在后台运行jar包
  9. SQL Server 2017 AlwaysOn on Linux 配置和维护(18)
  10. 小白学python系列-(4)list