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

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. CentOS 6.6 (Desktop)部署Apache、MySQL以及Eclipse Luna等记录

    内容较多,持续更新(2015-03-12 16:37:05) *如果没有特别说明,以下操作都是在root账号下完成,图形界面为GNOME. 一.防火墙 先从防火墙入手,为了后续的环境搭建,需要打开80 ...

  2. linux 解压缩

    tar f 使用档案名字,这个参数是最后一个参数,后面只能接档案名 c 建立压缩档案 x 解压 t 查看内容 r 向压缩归档文件末尾追加文件 u 更新原压缩包中的文件 z 有gzip属性的 j 有bz ...

  3. vs2010调试程序出现“Cannot find or open the PDB file”

    项目中源程序编写好以后, (一个简单的小程序) #include int main(void) { int age; int day; age = 24; printf("tom is %d ...

  4. js方法类库封装的简易示例

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></s ...

  5. Linear regression with one variable算法实例讲解(绘制图像,cost_Function ,Gradient Desent, 拟合曲线, 轮廓图绘制)_矩阵操作

    %测试数据 'ex1data1.txt', 第一列为 population of City in 10,000s, 第二列为 Profit in $10,000s 1 6.1101,17.592 5. ...

  6. C# 泛型约束

    一.泛型简介1.1泛型通过使用泛型,可以创建这样的类.接口和方法,它们以一种类型安全的工作方式操作各种数据.本质上,术语“泛型”指的是“参数化类型”(parameterized types).参数化类 ...

  7. checkbox复选框全选

    HTML: <input type="checkbox" class="all"> <input type="checkbox&qu ...

  8. java Unicode、ISO-8859-1、GBK、UTF-8编码转换深入浅出

    参考文献:搞懂ASCII, ISO8859-1, ANSI和Unicode Unicode百度文献 ISO-8859-1百度文献 注: 1.utf-8虽然是国际编码,对不同范围的字符使用不同长度的编码 ...

  9. EVE ToDo

    1. 打捞无人机 2. 无人机命中

  10. 解决git客户端MINGW32下的“Could not open a connection to your authentication agent.”

    使用git, 下载客户端后想进行和github 进行ssh 互通 出现以下情况: hadoop@deng-PC MINGW32 ~/.ssh$ ssh-add ~/.ssh/id_rsaCould n ...