“最大子序列和”算法 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; /** * ┏┓ ┏┓+ + * ┏┛┻━━━ ...
随机推荐
- weblogic安装使用: Could not Create the Java Virtual Machine
第一次使用weblogic,完全不明白是怎么一回事!找安装包花了大把时间!找到了不知道怎么安装 -- _ --||| 找了一篇安装文档<weblogic 安装部署手册.doc>, 位于:[ ...
- windows控制台程序——关于UNICODE字符的总结(转)
前言:从Windows NT/2000开如,Windows系统已经是一个标准的UNICODE系统,系统内部所有字符串存储及操作均使用UNICODE编码.因此Win32 API都是UNICODE版本的, ...
- SPOJ 375. Query on a tree (动态树)
375. Query on a tree Problem code: QTREE You are given a tree (an acyclic undirected connected graph ...
- Scramble String -- LeetCode
原题链接: http://oj.leetcode.com/problems/scramble-string/ 这道题看起来是比較复杂的,假设用brute force,每次做分割,然后递归求解,是一个 ...
- CentOS7LINUX 内核调试符号安装
yum install -y kernel-devel # debuginfo,在CentOS7中需要这样装 sudo vim /etc/yum.repos.d/CentOS-Debuginfo.re ...
- 多进程多线程GDB调试 (转)
多进程多线程GDB调试 一.线程调试指南: 1. gdb attach pid 挂载到调试进程 2. gdb$ set scheduler-locking on 只执行当前选定线程的 ...
- C#程序集系列01,用记事本编写C#,IL代码,用DOS命令编译程序集,运行程序
本篇主要体验:编写C#,IL代码,用"VS2012开发人员命令提示"编译成程序集,并运行程序. □ C#文件编译为程序集 →在F盘创建as文件夹→在as文件夹下创建MyClass. ...
- spring mvc 下 applicationContext 和webApplicationContext
spring中的ApplicationContexts可以被限制在不同的作用域.在web框架中,每个DispatcherServlet有它自己的WebApplicationContext,它包含了Di ...
- android应用名称设置的问题
<application android:label="@string/app_name1" <activity and ...
- 【spring boot】【log4jdbc】使用log4jdbc打印mybatis的sql和Jpa的sql语句运行情况
在spring boot 中使用mybatis 想看到sql语句的运行情况. 虽然按照 之前说的配置了 logging.level.你的mapper包位置 = debug 但是依旧没有起作用. 所以采 ...