最大子序列(java版)
2024-09-14 17:31:03
package com.algorithm.test;
/**
* 最大子序列
* @author LiFen
*
*/
public class LargestSubsequence {
public static void main(String[] args) {
int[] arr = {,-,,-,-,,,-};
System.out.println(maxSubSum(arr)); System.out.println(maxSumRec(arr, , arr.length - )); System.out.println(maxSubSum2(arr));
} /*
* 时间复杂度O(N*N)
*/
public static int maxSubSum(int [] a) {
int maxSum = ; for(int i = ; i < a.length; i++) {
int thisSum = ;
for(int j = ; j < a.length; j++) { thisSum += a[j]; if(thisSum > maxSum)
maxSum = thisSum;
}
}
return maxSum;
}
/*
* 递归
* 时间复杂度O(N logN)
*/
public static int maxSumRec(int [] a, int left, int right) {
if(left == right) {
if(a[left] > )
return a[left];
else return ;
} int center = (left + right) / ;
int maxLeftSum = maxSumRec(a, left, center);
int maxRightSum = maxSumRec(a, center + , right); int maxLeftBorderSum = ,leftBorderSum = ;
for(int i = center; i >= left; i--) {
leftBorderSum += a[i];
if(leftBorderSum > maxLeftBorderSum)
maxLeftBorderSum = leftBorderSum;
} int maxRightBorderSum = , rightBoderSum = ;
for(int i = center + ; i <= right; i++) {
rightBoderSum += a[i];
if(rightBoderSum > maxRightBorderSum)
maxRightBorderSum = rightBoderSum;
}
return Math.max(Math.max(maxLeftSum, maxRightSum),maxLeftBorderSum + maxRightBorderSum);
}
/*
* 联机算法
* 快
*/
public static int maxSubSum2(int [] a) {
int maxSum = , thisSum = ; for(int i = ; i < a.length; i++) {
thisSum += a[i]; if(thisSum > maxSum) {
maxSum = thisSum;
}else if(thisSum < ){
thisSum = ;
}
}
return maxSum;
}
}
最新文章
- React2
- DataTables 控件使用和心得 (1) - 入门
- C++ Primer Plus读书笔记
- 在github上创建新分支
- iOS-打开word、ppt、pdf、execl文档方式
- Linux有问必答:怎样解决“XXX is not in the sudoers file”错误
- java根据sessionid获取session
- HDU 2151 Worm
- Object-C Dealloc
- bzoj1415
- js中浮点型运算 注意点
- 转 四大Java EE容器(Tomcat、JBoss、Resin、Glassfish)之简单比较
- Java基础系列--08_集合1
- C语言:函数嵌套2^2!+3^2!
- 【原】cpu消耗高,查看对应的线程栈信息
- bzoj1047/luogu2216 理想的正方形 (单调队列)
- PHP微信公共号H5支付。
- vue框架之自定义组件中使用v-model
- abp运行机制分析
- java thrift返回List异常