Java 算法随笔(一)
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 算法随笔(一)的更多相关文章
- JAVA算法系列 冒泡排序
java算法系列之排序 手写冒泡 冒泡算是最基础的一个排序算法,简单的可以理解为,每一趟都拿i与i+1进行比较,两个for循环,时间复杂度为 O(n^2),同时本例与选择排序进行了比较,选择排序又叫直 ...
- JAVA算法系列 快速排序
java算法系列之排序 手写快排 首先说一下什么是快排,比冒泡效率要高,快排的基本思路是首先找到一个基准元素,比如数组中最左边的那个位置,作为基准元素key,之后在最左边和最右边设立两个哨兵,i 和 ...
- java算法 蓝桥杯 乘法运算
问题描述 编制一个乘法运算的程序. 从键盘读入2个100以内的正整数,进行乘法运算并以竖式输出. 输入格式 输入只有一行,是两个用空格隔开的数字,均在1~99之间(含1和99). 输出格式 输出为4行 ...
- java算法 蓝桥杯 扶老奶奶街
一共有5个红领巾,编号分别为A.B.C.D.E,老奶奶被他们其中一个扶过了马路. 五个红领巾各自说话: A :我和E都没有扶老奶奶 B :老奶奶是被C和E其中一个扶过大街的 C :老奶奶是被我和D其中 ...
- java算法 蓝桥杯 高精度加法
问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数,就要用软件来扩展了,比如用数组或 ...
- java算法 蓝桥杯 格子位置
问题描述 输入三个自然数N,i,j (1<=i<=N,1<=j<=N),输出在一个N*N格的棋盘中,与格子(i,j)同行.同列.同一对角线的所有格子的位置. 输入格式 输入共三 ...
- java算法----排序----(6)希尔排序(最小增量排序)
package log; public class Test4 { /** * java算法---希尔排序(最小增量排序) * * @param args */ public static void ...
- java算法----排序----(5)归并排序
package log; import java.util.Arrays; public class Test4 { /** * java算法---归并排序 * * @param args */ pu ...
- java算法----排序----(4)快速排序
package log; public class Test4 { /** * java算法---快速排序 * * @param args */ public static void main(Str ...
随机推荐
- 单元测试模拟request后台
编写测试单元 @RunWith(SpringJUnit4ClassRunner.class) 让测试运行于Spring测试环境 @WebAppConfiguration是一个类级别的注释,用于声明Ap ...
- struts2分页实现
1.定义一个page类,里面包括每一个的数量,当前页码,总记录数,等 2.将page对象传入dao中,dao输出分页查询好的数据.返回到action中,action放到request中,jsp从req ...
- Python面向对象(三)
一.绑定方法与非绑定方法 一.绑定方法:绑定给谁就应该由谁来调用,谁来调用就会将谁当作第一个参数传入 1.绑定给对象的方法:类中定义的函数默认就是绑定给对象的 2.绑定给类的方法:为类中定义的函数加上 ...
- React 内部属性与函数
constructor 构造函数,在创建组件的时候调用一次. 例子: class TodoList extends React.Component { constructor(props, conte ...
- DOM 事件冒泡
1.什么是事件冒泡? 事件冒泡就是从具体到不具体, 例如:当你给了一个button按钮一个点击事件,再给他的父级相同的事件,就会按照,button,body,document,window,继续向上冒 ...
- HTML头部元素实例
HTML head 元素 标签 描述 <head> 定义了文档的信息 <title> 定义了文档的标题 <base> 定义了页面链接标签的默认链接地址 <li ...
- Eclipse reference
http://download.csdn.net/download/ling_min/4318719 http://www.qualityeclipse.com/eclipse-gef http:// ...
- 安卓NDK流程
定义wrap类,声明native函数,加载库 package com.ndk.hello; public class Classs { public native String say_hello() ...
- 使用browsermob代理出现错误java.lang.NoClassDefFoundError: org/littleshoot/proxy/HttpFiltersSource
使用browsermob代理做埋点数据,maven配置的包如下 <dependency> <groupId>net.lightbody.bmp</groupId> ...
- 进程、内存的理想与现实 VS 虚拟内存
理想情况下一个进程的运行,需要一块足够大的连续的内存进行装载. 现状: 1)内存不够大:分解进程内存空间. 2)内存不连续:内存映射.