1. 最大子序列和问题

给定(可能有负数)整数a(1)、a(2)、……a(n),求 a(1)+a(2)+……+a(j)的最大值。

也就是:在一系列整数中,找出连续的若干个整数,这若干个整数之和最大。有参考(https://www.cnblogs.com/hapjin/p/5404705.html)


(1)时间复杂度O(nLogn) 空间复杂度O(n²)
dp[0][2] 代表[0]位置[2]步长的最大和值
dp[i][0] 代表[0]位置的最大和
由于 i 位置最多还有 (arr.length - i) 步 到数组尾部~再往后就越界了, 所以从i开始走直接走到最后

static int OnLogn(int []arr){
int n = arr.length;
int maxSum = arr[0];
int[][] dp = new int[n][n + 1]; for (int i = 0; i < n; i++) {
for (int j = i+1; j < n + 1 && arr[i] > 0; j++) {
dp[i][j - i] = dp[i][j -i- 1] + arr[j - 1];
maxSum = max(maxSum, dp[i][j - i]);
}
}
return maxSum;
}

(2)时间复杂度O(nLogn) 空间复杂度O(n)
对(1)的改进主要是使用滚动数组
( 8 ~ 9 两行对 i 没有修改操作所以 8 ~ 9 两行改为 dp[j - i] = dp[j -i- 1] + arr[j - 1]; 这样就可以降低空间复杂度 )

static int OnLogn(int []arr){
int n = arr.length;
int maxSum = arr[0];
int[] dp = new int[n + 1];
/*
* dp[0][1] 代表 0 坐标 一步长 的最大值
*/ for (int i = 0; i < n; i++) {
for (int j = i+1; j < n + 1 && arr[i] > 0; j++) {
dp[j - i] = dp[j -i- 1] + arr[j - 1];
maxSum = max(maxSum, dp[j - i]);
}
}
return maxSum;
}

  

(2)时间复杂度O(n) 空间复杂度O(n)

static int On(int[] arr) {
int maxSum = arr[0];
int thisSum = arr[0];
for (int i = 0; i < arr.length; i++) {
thisSum += arr[i];
if (thisSum > maxSum)// thisSum在[0,maxSum]之间时不需要任何处理
maxSum = thisSum;
else if (thisSum < 0)// 说明加上当前元素使得子序列为负数了,那么抛弃这段子序列(相当于thisSum赋值为0),从下一轮for开始
thisSum = 0;
System.out.println(i + " : "+thisSum);
}
if(maxSum < 0)
for(int i = 0; i < arr.length; i++)
if(arr[i] > maxSum) maxSum = arr[i];
return maxSum;
}

  

Java 算法随笔(一)的更多相关文章

  1. JAVA算法系列 冒泡排序

    java算法系列之排序 手写冒泡 冒泡算是最基础的一个排序算法,简单的可以理解为,每一趟都拿i与i+1进行比较,两个for循环,时间复杂度为 O(n^2),同时本例与选择排序进行了比较,选择排序又叫直 ...

  2. JAVA算法系列 快速排序

    java算法系列之排序 手写快排 首先说一下什么是快排,比冒泡效率要高,快排的基本思路是首先找到一个基准元素,比如数组中最左边的那个位置,作为基准元素key,之后在最左边和最右边设立两个哨兵,i 和 ...

  3. java算法 蓝桥杯 乘法运算

    问题描述 编制一个乘法运算的程序. 从键盘读入2个100以内的正整数,进行乘法运算并以竖式输出. 输入格式 输入只有一行,是两个用空格隔开的数字,均在1~99之间(含1和99). 输出格式 输出为4行 ...

  4. java算法 蓝桥杯 扶老奶奶街

    一共有5个红领巾,编号分别为A.B.C.D.E,老奶奶被他们其中一个扶过了马路. 五个红领巾各自说话: A :我和E都没有扶老奶奶 B :老奶奶是被C和E其中一个扶过大街的 C :老奶奶是被我和D其中 ...

  5. java算法 蓝桥杯 高精度加法

    问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数,就要用软件来扩展了,比如用数组或 ...

  6. java算法 蓝桥杯 格子位置

    问题描述 输入三个自然数N,i,j (1<=i<=N,1<=j<=N),输出在一个N*N格的棋盘中,与格子(i,j)同行.同列.同一对角线的所有格子的位置. 输入格式 输入共三 ...

  7. java算法----排序----(6)希尔排序(最小增量排序)

    package log; public class Test4 { /** * java算法---希尔排序(最小增量排序) * * @param args */ public static void ...

  8. java算法----排序----(5)归并排序

    package log; import java.util.Arrays; public class Test4 { /** * java算法---归并排序 * * @param args */ pu ...

  9. java算法----排序----(4)快速排序

    package log; public class Test4 { /** * java算法---快速排序 * * @param args */ public static void main(Str ...

随机推荐

  1. 单元测试模拟request后台

    编写测试单元 @RunWith(SpringJUnit4ClassRunner.class) 让测试运行于Spring测试环境 @WebAppConfiguration是一个类级别的注释,用于声明Ap ...

  2. struts2分页实现

    1.定义一个page类,里面包括每一个的数量,当前页码,总记录数,等 2.将page对象传入dao中,dao输出分页查询好的数据.返回到action中,action放到request中,jsp从req ...

  3. Python面向对象(三)

    一.绑定方法与非绑定方法 一.绑定方法:绑定给谁就应该由谁来调用,谁来调用就会将谁当作第一个参数传入 1.绑定给对象的方法:类中定义的函数默认就是绑定给对象的 2.绑定给类的方法:为类中定义的函数加上 ...

  4. React 内部属性与函数

    constructor 构造函数,在创建组件的时候调用一次. 例子: class TodoList extends React.Component { constructor(props, conte ...

  5. DOM 事件冒泡

    1.什么是事件冒泡? 事件冒泡就是从具体到不具体, 例如:当你给了一个button按钮一个点击事件,再给他的父级相同的事件,就会按照,button,body,document,window,继续向上冒 ...

  6. HTML头部元素实例

    HTML head 元素 标签 描述 <head> 定义了文档的信息 <title> 定义了文档的标题 <base> 定义了页面链接标签的默认链接地址 <li ...

  7. Eclipse reference

    http://download.csdn.net/download/ling_min/4318719 http://www.qualityeclipse.com/eclipse-gef http:// ...

  8. 安卓NDK流程

    定义wrap类,声明native函数,加载库 package com.ndk.hello; public class Classs { public native String say_hello() ...

  9. 使用browsermob代理出现错误java.lang.NoClassDefFoundError: org/littleshoot/proxy/HttpFiltersSource

    使用browsermob代理做埋点数据,maven配置的包如下 <dependency> <groupId>net.lightbody.bmp</groupId> ...

  10. 进程、内存的理想与现实 VS 虚拟内存

    理想情况下一个进程的运行,需要一块足够大的连续的内存进行装载. 现状: 1)内存不够大:分解进程内存空间. 2)内存不连续:内存映射.