“最大子序列和”算法 java
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的更多相关文章
- 归并排序算法 java 实现
归并排序算法 java 实现 可视化对比十多种排序算法(C#版) [直观学习排序算法] 视觉直观感受若干常用排序算法 算法概念 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Di ...
- 快速排序算法 java 实现
快速排序算法 java 实现 快速排序算法Java实现 白话经典算法系列之六 快速排序 快速搞定 各种排序算法的分析及java实现 算法概念 快速排序是C.R.A.Hoare于1962年提出的一种划分 ...
- 堆排序算法 java 实现
堆排序算法 java 实现 白话经典算法系列之七 堆与堆排序 Java排序算法(三):堆排序 算法概念 堆排序(HeapSort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,可以利用数组的特 ...
- Atitit 电子商务订单号码算法(java c# php js 微信
Atitit 电子商务订单号码算法(java c# php js 微信 1.1. Js版本的居然钱三爷里面没有..只好自己实现了. 1.2. 订单号标准化...长度16位 1.3. 订单号的结构 前 ...
- 无向图的最短路径算法JAVA实现
一,问题描述 给出一个无向图,指定无向图中某个顶点作为源点.求出图中所有顶点到源点的最短路径. 无向图的最短路径其实是源点到该顶点的最少边的数目. 本文假设图的信息保存在文件中,通过读取文件来构造图. ...
- 无向图的最短路径算法JAVA实现(转)
一,问题描述 给出一个无向图,指定无向图中某个顶点作为源点.求出图中所有顶点到源点的最短路径. 无向图的最短路径其实是源点到该顶点的最少边的数目. 本文假设图的信息保存在文件中,通过读取文件来构造图. ...
- 基于FP-Tree的关联规则FP-Growth推荐算法Java实现
基于FP-Tree的关联规则FP-Growth推荐算法Java实现 package edu.test.ch8; import java.util.ArrayList; import java.util ...
- 双色球机选算法java实现
双色球机选算法java实现 一.代码 package com.hdwang; import java.util.Random; /** * Created by admin on 2017/1/10. ...
- Floyd算法java实现demo
Floyd算法java实现,如下: https://www.cnblogs.com/Halburt/p/10756572.html package a; /** * ┏┓ ┏┓+ + * ┏┛┻━━━ ...
随机推荐
- ASP.NET 构建高性能网站 第6篇
内存问题概述 和CPU一样,内存也是一个直接影响服务端性能的重要的硬件资源. 一般来说,如果服务端内存不足,从导致以下两个问题产生: 1. 导致服务端把一些原本要写到内存中的数据,写到硬盘 ...
- SVN服务器与客户端下载地址_搭建使用
下载地址: http://subversion.apache.org/packages.html Windows CollabNet (supported and certified by Colla ...
- lanmp安装一(centos+apache+nginx+mysql+php=lanmp地址下载)
背景 centos7 官网地址https://www.centos.org/download/ 下载选择DVD版进入(也就是标准版,系统齐全) 点击任何一个国家的下载链接 下载地址 http://m ...
- HDU 4718 The LCIS on the Tree (动态树LCT)
The LCIS on the Tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Oth ...
- Maven根据不同环境打包不同配置文件
开发项目时会遇到这个问题:开发环境,测试环境,生产环境的配置文件不同,打包时经常要手动更改配置文件,更改的少还可以接受,但是如果需要更多个配置文件,手动的方法就显得非常笨重了. 下面介绍一种方法,利用 ...
- 【Nginx】ngx_event_core_module模块
ngx_event_core_module模块属于事件模块,它是其他事件类模块的基础.它主要完毕下面任务: 创建连接池 决定使用哪些事件驱动机制 初始化将要使用的事件模块 以下分析该模块的代码. ng ...
- Linux系统不可不知的命令:sudo
转自:http://www.embeddedlinux.org.cn/html/xinshourumen/201308/05-2608.html sudo是个统管一切的命令.它的字面意思是代表“超级用 ...
- symbol(s) not found for architecture armv7
Undefined symbols for architecture i386: “_OBJC_CLASS_$_XXX”, referenced from: objc-class-ref in XXX ...
- DockManager如何停靠 z
DockManager默认只能停靠在窗体上,如果想停靠在其他控件上,我们发现并没有选项可以选,可能目前大部分解决方法是新建一个用户控件文件,再在用户控件里面单独设计模块. 除了这种方法还有没有其他的呢 ...
- freetype
FreeType编译及使用心得收藏 FreeType是一款字体服务库,它支持多种字体,并且提供高效,高质量的文字. freetype相关介绍见:http://blog.csdn.net/ganxi ...