“最大子序列和”算法 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; /** * ┏┓ ┏┓+ + * ┏┛┻━━━ ...
随机推荐
- Xcode 中的IOS工程模板
1.IOS模板主要分为: Application .Framework.Other application 分为:Master-Detail Application 可以构建树形导航模式引用,生成的代 ...
- Window 8 启用 Telnet 命令工具一览图
Window 8 启用 Telnet 命令工具一览图 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创 ...
- Turtelizer 2 provide JTAG Flash programming and debugging of ARM based boards via USB
http://www.ethernut.de/en/hardware/turtelizer/ Introducing Turtelizer 2 Overview Turtelizer 2 had be ...
- 盘点Linux内核源码中使用宏定义的若干技巧(1)
http://blog.chinaunix.net/uid-23769728-id-3141515.html
- spring boot JedisCluster连接redis集群配置
配置文件 配置类 构造的时候, 可以看一下, 只有Set<HostAndPort> 参数是必须的 做了一层封装, 更方便使用 结果
- .NET:如何让线程支持超时?
背景 本文是为了回复博客园一个兄弟的问题,主要回答两个问题: 如何让线程支持超时? 如何让线程在执行结束后销毁? MS 现在不推荐使用低级别的 Thread 编程,而推荐使用 Task,另外我多数情况 ...
- Nginx+Memcached+Tomcat集群配置实践(Sticky Session)
准备工作 创建一个简单的web应用,名为session.其中有两个页面,分别如下所示: 页面login.jsp <%@ page language="java" conten ...
- Web项目中获取SpringBean——在非Spring组件中获取SpringBean
最近在做项目的时候我发现一个问题:Spring的IOC容器不能在Web中被引用(或者说不能被任意地引用).我们在配置文件中让Spring自 动装配,但并没有留住ApplicationContext的实 ...
- bzoj 1975 [Sdoi2010]魔法猪学院
1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1758 Solved: 557[Submit][Statu ...
- iOS:UIButton按钮的详解
UIButton的详细介绍: 一.按钮具有的属性: @property(nonatomic,readonly) UIButtonType buttonType; //按钮形状类型 @property ...