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 ...
随机推荐
- struts2的常量
常量名 常量值 说明 struts.i18n.encoding UTF-8 应用中使用的编码 struts.objectFactory.spring.autoWire name 和spring框架整合 ...
- vue学习第二天 ------ 临时笔记
学习链接: vue.js官方文档: https://cn.vuejs.org/v2/guide/index.html vue.js API: https://cn.vuejs.org/v2/api/# ...
- Touch事件传递的实验
通过自定义的Relayout LinearLayout TextView , 布局为: 分别打印事件方法: 1.当所有的都是super的时候,点击TextView的时候,事件的传递是: ...
- 5步玩转Power BI Embedded,老司机全程带路解析
最近,由世纪互联运营的 Microsoft Azure 发布了一个超级炫酷的服务 Power BI Embedded,该服务可以通过 REST API 和 Power BI SDK 将 Power B ...
- sqlalchemy使用tip
https://docs.sqlalchemy.org/en/latest/orm/tutorial.html http://docs.sqlalchemy.org/en/latest/core/sq ...
- kk录像机怎么剪辑视频 kk录像机视频剪辑教程
很多朋友录制视频都是用KK录像机,录制视频过后我们需要对视频进行修改和调整,下面小编就教大家怎么来剪辑KK录像机录制的视频 1.首先我们打开软件点[添加一个视频],添加需要剪切的视频 2.将播放指针移 ...
- Python模块与函数
python的程序由包(package).模块(module)和函数组成.模块是处理某一类问题的集合,模块由函数和类组成,包是由一系列模块组成的集合.包必须至少包含一个__init__.py文件,该文 ...
- DOM笔记(十三):JavaScript的继承方式
在Java.C++.C#等OO语言中,都支持两种继承方式:接口继承和实现继承.接口继承制继承方法签名,实现继承则继承实际的方法和属性.在SCMAScript中,由于函数没有签名,所以无法实现接口继承, ...
- 解决Zend加密的PHP页面出现Incompatible file format的问题
错误如图: 致命错误:不兼容的文件格式可能的原因: 1.文件本身加密的问题,很有可能你用的Zend进行加密了,但是因为版本的问题,很有可能是你的主机上的Zend Optimizer版本太低了.2.文件 ...
- IOS NSThread 线程间通信
@interface HMViewController () @property (weak, nonatomic) IBOutlet UIImageView *imageView; @end @im ...