先来看看问题的来源,假设有这么一个数组:

1 2 -5 4 -2 3 -3 4 -15

我们要求出其中连续字数组的和的最大值 例如这么可以很明显看出 4+ –2 + 3 + –3 + 4 = 6 所有可能子数组的和的是最大值。

那我们应该如何实现呢:首先就是把所有可能的字数组的和求出来然后作比较就能得到最大值了,就像冒泡排序一样只是排序的对象需要经过一些处理:

   1:     public static void main(String[] args) {
   2:          int max = 0;
   3:          int a[] = { 1, 2, -5, 4, -2, 3, -3, 4, -15 };
   4:          for (int i = 0; i < a.length; i++) {
   5:              int sum = 0;
   6:              for (int j = i; j < a.length; j++) {
   7:                  sum += a[j];
   8:                  max = maxoftwo(max, sum);
   9:              }
  10:          }
  11:          System.out.println(max);
  12:      }
  13:   
  14:      private static int maxoftwo(int max, int sum) {
  15:          if (max > sum) {
  16:              return max;
  17:          } else {
  18:              return sum;
  19:          }
  20:      }

这里大概要运行时间为O(n2),这个时候再分析分析就会发现用分治算法会简便。我们将数组分为左右相等大小的子数组。

                 a                  b

这个时候用一个for循环就可以求出a,b中和的最大值

              lmax(a)            rmax(b)

这里还需要注意在两个数组的边界处相加也可能是最大值,左边从右往左的寻找最大和,右边从左往右寻找最大和,所以需要比较 lmax(a)+rmax(b),lmax(a),rmax(b)。

                                              
   1:      public static void main(String[] args) {
   2:          int max = 0;
   3:          int a[] = { 1, 2, -5, 4, -2, 3, -3, 4, -15 };
   4:          max=getmax(a,0,a.length-1);
   5:          System.out.print(max);
   6:      }
   7:   
   8:      private static int getmax(int[] a_sort, int start, int end) {
   9:          int mid=0,lmax=0,rmax=0,sum=0;
  10:          if(start >end){
  11:              return -1;
  12:          }
  13:          if(start == end){
  14:              return maxcompare(0,a_sort[1]);
  15:          }
  16:          mid = (start+end)/2;
  17:          for(int i=mid;i>=start;i--){
  18:              sum+=a_sort[i];
  19:               lmax=maxcompare(lmax, sum);
  20:          }
  21:          sum=0;
  22:          for(int i=mid+1;i<=end;i++){
  23:              sum+=a_sort[i];
  24:               rmax=maxcompare(rmax, sum);
  25:          }
  26:          return(maxcompare(maxcompare(lmax+rmax, getmax(a_sort, start, mid)),getmax(a_sort, mid+1, end)));
  27:      }
  28:   
  29:      private static int maxcompare(int i, int j) {
  30:          if(i>j){
  31:              return i;
  32:          }else{
  33:              return j;
  34:          }
  35:      }

对分治算法也还没有达到深深理解和灵活运用的境界,怎么才能让这种思想永存脑海呢?

从两个平方算法到分治算法-java的更多相关文章

  1. 算法准备-分治算法解决第k位数的线性查找

    由作业士兵排队问题引出的 在一个划分成网格的操场上,n个士兵散乱地站在网格点上.网格点由整数最表(x,y)表示.士兵可以沿着网格边上.下.左.右移动一步,但在同一时刻一个网格上只能有一名士兵.按照军官 ...

  2. 算法leetcode_分治算法

    一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子 ...

  3. NOI题库分治算法刷题记录

    今天晚自习机房刷题,有一道题最终WA掉两组,极其不爽,晚上回家补完作业欣然搞定它,特意来写篇博文来记录下 (最想吐槽的是这个叫做分治的分类,里面的题目真的需要分治吗...) 先来说下分治法 分治法的设 ...

  4. 计算几何 平面最近点对 nlogn分治算法 求平面中距离最近的两点

    平面最近点对,即平面中距离最近的两点 分治算法: int SOLVE(int left,int right)//求解点集中区间[left,right]中的最近点对 { double ans; //an ...

  5. UVA 10245 The Closest Pair Problem 最近点问题 分治算法

    题意,给出n个点的坐标,找出两点间最近的距离,如果小于10000就输出INFINITY. 纯暴力是会超时的,所以得另辟蹊径,用分治算法. 递归思路将点按坐标排序后,分成两块处理,最近的距离不是在两块中 ...

  6. 从分治算法到 Hadoop MapReduce

    从分治算法说起 要说 Hadoop MapReduce 就不得不说分治算法,而分治算法其实说白了,就是四个字 分而治之 .其实就是将一个复杂的问题分解成多组相同或类似的子问题,对这些子问题再分,然后再 ...

  7. 目标反射回波检测算法及其FPGA实现 之三:平方、积分电路及算法的顶层实现

    目标反射回波检测算法及其FPGA实现之三: 平方.积分电路及算法的顶层实现 前段时间,接触了一个声呐目标反射回波检测的项目.声呐接收机要实现的核心功能是在含有大量噪声的反射回波中,识别出发射机发出的激 ...

  8. C#LeetCode刷题-分治算法

    分治算法篇 # 题名 刷题 通过率 难度 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组的中位数(Median of Two Sorted Arrays)-该题未达最优解 30 ...

  9. 分治算法(二分查找)、STL函数库的应用第五弹——二分函数

    分治算法:二分查找!昨天刚说不写算法了,但是突然想起来没写过分治算法的博客,所以强迫症的我…… STL函数库第五弹——二分函数lower_bound().upper_bound().binary_se ...

随机推荐

  1. MongoDB 副本集的相关概念【转】

    一.副本集基本概念 副本集(replica set) MongoDB的replica set是一个mongod进程实例簇,数据在这个簇中相互复制,并自动进行故障切换. MongoDB的数据库复制增加了 ...

  2. Android 运行时权限处理

    引言 Android 6.0 (API 23) 开始引入了运行时权限检查 (Permissions at Run Time),用户不需要在安装时同意授予应用权限,而是在应用运行时动态去申请所需要的权限 ...

  3. Android Volley入门到精通:定制自己的Request

    经过前面两篇文章的学习,我们已经掌握了Volley各种Request的使用方法,包括StringRequest.JsonRequest.ImageRequest等.其中StringRequest用于请 ...

  4. XP/Win7下QTP11循环试用30天的破解方法

    XP/Win7下QTP11循环试用30天的破解方法. XP下:1.找到以下路径:C:\Documents and Settings\All Users\Application Data\SafeNet ...

  5. python基础——第三方模块

    python基础——第三方模块 在Python中,安装第三方模块,是通过包管理工具pip完成的.  如果你正在使用Mac或Linux,安装pip本身这个步骤就可以跳过了.  如果你正在使用Window ...

  6. 用Mysqlbinlog备份BinLog文件

    默认情况下, mysqlbinlog读取二进制文件[BinLog]并以文本的方式呈现[text format].mysqlbinlog可以直接地从本地读取Log,也可以读取远程的Log[--read- ...

  7. Java Web基础——Action+Service +Dao三层的功能划分

    1. Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. D ...

  8. 谈谈我的编程之路---WAMP(一)

    WAMP的一些配置与使用心得(PHP) 记得第一次接触PHP的时候,我都不知道PHP为什么要大写,但是我却用它来进行工作了,有时候生活就是一场美丽的邂逅 青涩的我,在ES哥的引领下,第一次接触到了WA ...

  9. php单双引号

    1.定义字符串 定义字符串时,只有一种引号被视为定义符,即单引号或双引号.于是,如果一个字符串由双引号开始,那么只有双引号被分析器解析.这样,你就可以在双引号串中包含任何其他字符,甚至单引号.下面的引 ...

  10. jQuery - 4.简单选择器

    4.1 简单选择器   (1) :first 选取第一个元素.   (2) :last 选取最后一个元素.  (3) :not(选择器) 选取不满足"选择器"条件的元素   (4) ...