java实现最大连续和问题
2024-09-06 12:14:05
/*
10 5 -3 12 -31 15 22 -7 6 -8 -9 10 ....
暴力:O(n^3)
分治:[ mid ) 三种情况求最大
基线法: O(n)
2个数组:
从左到本位:出现的最大累加
从左到本位:累加的最小值
网搜:最大连续和
*/
public class A
{
// 对a, [p,q) 区间求最大连续和
public static int g(int[] a, int p, int q)
{
if(q-p==1){
if(a[p]>0) return a[p];
return 0;
}
int mid = (p+q)/2;
int max = 0;
int m1 = g(a,p,mid);
if(m1>max) max = m1;
int m2 = g(a,mid,q);
if(m2>max) max = m2;
// 中间向左扩展搜索
int m3a=0;
int sum = 0;
for(int i=mid; i>=p; i--){
sum += a[i];
if(sum>m3a) m3a = sum;
}
// 中间向右扩展搜索
int m3b=0;
sum = 0;
for(int i=mid+1; i<q; i++){
sum += a[i];
if(sum>m3b) m3b = sum;
}
int m3 = m3a + m3b;
if(m3>max) max = m3;
return max;
}
public static int f(int[] a)
{
int max = 0;
for(int i=0; i<a.length; i++)
for(int j=i+1; j<a.length+1; j++){
int sum = 0;
for(int k=i; k<j; k++) sum += a[k];
if(sum > max) max = sum;
}
return max;
}
public static void main(String[] args)
{
final int N = 2000;
int[] a = new int[N];
for(int i=0; i<a.length; i++){
a[i] = (int)(Math.random() * 100) - 50;
}
System.out.println(f(a));
System.out.println("-----------------------");
System.out.println(g(a,0,a.length));
}
}
最新文章
- Linux各个目录的作用及内容
- 开始VS 2012中LightSwitch系列的第5部分:我可以使用用户权限来控制访问权吗?
- [数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁
- 【BZOJ-1941】Hide and Seek KD-Tree
- robotframework笔记4
- POJ 3621Sightseeing Cows
- Android基础笔记(十四)- 内容提供者读取联系人
- JSP 和 Servlet 有哪些相同点和不同点, 他们之间的联系是什么?
- Groovy 设计模式 -- 组合模式
- C#使用CH341 SPI模块读写SD卡
- 【原创+整理】简述何为调用约定,函数导出名以及extern C
- C#如何使用REST接口读写数据
- 即时通讯(IV)
- Python if条件判断
- Failed to connect to /127.0.0.1:8080
- [剑指Offer]38-字符串的全排列
- Ubuntu中针对问题 E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)的解决方案
- Django里自定义用户登陆及登陆后跳转到登陆前页面的实现
- Day Seven
- c++下为使用pimpl方法的类编写高效的swap函数