maxSubSum各自是最大子序列和的4中java算法实现。

第一种算法执行时间为O(N^3),另外一种算法执行时间为O(N^2),第三种算法执行时间为O(nlogn),第四种算法执行时间为线性N

public class Test {
public static void main(String[] args) {
int[] a = {-2, 11, -4, 13, -5, -2};//最大子序列和为20
int[] b = {-6, 2, 4, -7, 5, 3, 2, -1, 6, -9, 10, -2};//最大子序列和为16
System.out.println(maxSubSum4(a));
System.out.println(maxSubSum4(b));
}
//最大子序列求和算法一
public static int maxSubSum1(int[] a){ int maxSum = 0; //从第i个開始找最大子序列和
for(int i = 0; i < a.length; i++) { //找第i到j的最大子序列和
for(int j = i; j<a.length; j++) { int thisSum = 0; //计算从第i个開始,到第j个的和thisSum
for(int k = i; k<=j; k++){
thisSum += a[k];
}
//假设第i到第j个的和小于thisSum。则将thisSum赋值给maxSum
if(thisSum>maxSum) {
maxSum = thisSum;
}
}
}
return maxSum;
} public static int maxSubSum2(int[] a) {
int maxSum = 0;
for(int i = 0; i < a.length; i++) {
//将sumMax放在for循环外面。避免j的变化引起i到j的和sumMax要用for循环又一次计算
int sumMax = 0;
for(int j = i; j < a.length; j++) {
sumMax += a[j];
if(sumMax>maxSum) {
maxSum = sumMax;
}
}
}
return maxSum;
} //递归,分治策略
//2分logn,for循环n,固O(nlogn)
public static int maxSubSum3(int[] a) {
return maxSumRec(a, 0, a.length - 1);
}
public static int maxSumRec(int[] a, int left, int right) {
//递归中的基本情况
if(left == right) {
if(a[left] > 0) return a[left];
else return 0;
}
int center = (left + right) / 2;
//最大子序列在左側
int maxLeftSum = maxSumRec(a, left, center);
//最大子序列在右側
int maxRightSum = maxSumRec(a, center+1, right);
//最大子序列在中间(左边靠近中间的最大子序列+右边靠近中间的最大子序列)
int maxLeftBorderSum = 0, leftBorderSum = 0;
for(int i = center; i>=left; i--) {
leftBorderSum += a[i];
if(leftBorderSum > maxLeftBorderSum) maxLeftBorderSum = leftBorderSum;
}
int maxRightBorderSum = 0, rightBorderSum = 0;
for(int i = center+1; i<= right; i++) {
rightBorderSum += a[i];
if(rightBorderSum > maxRightBorderSum) maxRightBorderSum = rightBorderSum;
}
//返回最大子序列在左側,在右側。在中间求出的值中的最大的
return max3(maxLeftSum, maxRightSum, maxLeftBorderSum + maxRightBorderSum);
}
public static int max3(int a, int b, int c) {
return a > b? (a>c?a:c):(b>c? b:c);
}
//不论什么a[i]为负时,均不可能作为最大子序列前缀;不论什么负的子序列不可能是最有子序列的前缀
public static int maxSubSum4 (int [] a) {
int maxSum = 0, thisSum = 0;
for(int j = 0; j < a.length; j++) {
thisSum += a[j];
if(thisSum>maxSum) maxSum = thisSum;
else if (thisSum < 0) thisSum = 0;
}
return maxSum;
}
}

“最大子序列和”算法 java的更多相关文章

  1. 归并排序算法 java 实现

    归并排序算法 java 实现 可视化对比十多种排序算法(C#版) [直观学习排序算法] 视觉直观感受若干常用排序算法 算法概念 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Di ...

  2. 快速排序算法 java 实现

    快速排序算法 java 实现 快速排序算法Java实现 白话经典算法系列之六 快速排序 快速搞定 各种排序算法的分析及java实现 算法概念 快速排序是C.R.A.Hoare于1962年提出的一种划分 ...

  3. 堆排序算法 java 实现

    堆排序算法 java 实现 白话经典算法系列之七 堆与堆排序 Java排序算法(三):堆排序 算法概念 堆排序(HeapSort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,可以利用数组的特 ...

  4. Atitit 电子商务订单号码算法(java c# php js 微信

    Atitit 电子商务订单号码算法(java c# php js  微信 1.1. Js版本的居然钱三爷里面没有..只好自己实现了. 1.2. 订单号标准化...长度16位 1.3. 订单号的结构 前 ...

  5. 无向图的最短路径算法JAVA实现

    一,问题描述 给出一个无向图,指定无向图中某个顶点作为源点.求出图中所有顶点到源点的最短路径. 无向图的最短路径其实是源点到该顶点的最少边的数目. 本文假设图的信息保存在文件中,通过读取文件来构造图. ...

  6. 无向图的最短路径算法JAVA实现(转)

    一,问题描述 给出一个无向图,指定无向图中某个顶点作为源点.求出图中所有顶点到源点的最短路径. 无向图的最短路径其实是源点到该顶点的最少边的数目. 本文假设图的信息保存在文件中,通过读取文件来构造图. ...

  7. 基于FP-Tree的关联规则FP-Growth推荐算法Java实现

    基于FP-Tree的关联规则FP-Growth推荐算法Java实现 package edu.test.ch8; import java.util.ArrayList; import java.util ...

  8. 双色球机选算法java实现

    双色球机选算法java实现 一.代码 package com.hdwang; import java.util.Random; /** * Created by admin on 2017/1/10. ...

  9. Floyd算法java实现demo

    Floyd算法java实现,如下: https://www.cnblogs.com/Halburt/p/10756572.html package a; /** * ┏┓ ┏┓+ + * ┏┛┻━━━ ...

随机推荐

  1. flash 跨域加载 二次加载

    var url2:String = "http://thirdapp0.qlogo.cn/qzopenapp/fa5d80ebf9fc89aaa1d7ddb0e1b861e58d77b409 ...

  2. spring---aop(1)---AOP概念

    写在前面 由于spring的事务系列,可以带出spring的aop.spring的事务只是spring的一个具体实现 名词解释 通知.增强处理(Advice) 就是你想要的功能,也就是上说的安全.事物 ...

  3. Java_tomcat thread dump 分析

    前言 Java Thread Dump 是一个非常有用的应用诊断工具, 通过thread dump出来的信息, 可以定位到你需要了解的线程, 以及这个线程的调用栈. 如果配合linux的top命令, ...

  4. 华为S5300系列升级固件S5300SI-V100R005C00SPC100.cc

    这个固件附带了web,注意,这个插件是升级V200的必经固件,所以必须升级为此固件之后才能往下升级. 升级小插曲: 1.升级的使用使用Windows,不要用Mac或者Linux,因为从Mac/Linu ...

  5. MySQL增强版命令行客户端连接工具(mycli)

    效果: 安装: http://www.mycli.net/install 官网: http://www.mycli.net/install

  6. 怎样用Java代码来把SSL的证书自己主动导入到Java的秘钥存储文件(keystore)

    我们在开发或者使用SSL的过程中,非常多的软件须要我们提供java的keystore.特别是一些基于Java的中间件产品. 我们常规的做法是JDK自带的工具命令(keytool)去做.比方,以下的样例 ...

  7. datagrid在MVC中的运用07-实现Master-Detail(使用PartialView)

    本文主要体验用jQuery Easyui的datagrid来实现Master-Detail主次表.谢谢Kevin的博文,助我打开了思路. 主表显示所有的Category,当点击主表的展开按钮,显示该C ...

  8. java二分查找法

    //二分查找法.必须有前提:数组中的元素要有序. public static int halfSeach_2(int[] arr,int key){ int min,max,mid; min = ; ...

  9. MultipartFile+nio上传文件

    import java.io.File;import java.nio.file.Files;import java.nio.file.Path;import java.nio.file.Paths; ...

  10. IE中Ext的comboBox跑到页面左上角

    { xtype:'combo', width:100, //id:'exTypeCom', name:'exType', hiddenName:'exType', displayField:'text ...