package beautyOfCoding;
public class MaxSubArraySum {
/**
* 3.求子数组的最大和
题目描述:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。
下面的解法:数组元素全是负数时,认为子数组最大和为0
*/
public static void main(String[] args) {
int[] a={-1,-2,-3,-10};
// int[] a={1, -2, 3, 10, -4, 7, 2, -5};
maxSubArraySum3(a);
maxSubArraySum2(a);
maxSubArraySum(a);
}
/*2012-07-29 编程之美书上的这个分析比较好理解,因此我写了maxSubArraySum2。其实maxSubArraySum2可以轻易地转换成maxSubArraySum。这两个方法本质是一样的。
假设A[0],A[1],...A(n-1)的最大子段为A[i],...,A[j],则有以下3种情况
1)当0=i=j的时候,元素A[0]本身构成和最大的一段
2)当0=i<j的时候,和最大的一段以A[0]开头
3)当0<i时候,元素A[0]跟和最大的一段没有关系
Start[i]表示从第i个元素开始(包括第i个元素)的子数组和最大值,All[i]表示A[i]A[i+1]...A[n-1]这个数组的子数组和的最大值
则原始问题A[0],A[1],...A(n-1)的解All[0]=max{A[0],A[0]+Start[1],ALL[1]}
*/
static void maxSubArraySum2(int[] a){
//略去参数检查
int Start=0;
int All=0;
for(int i=0,len=a.length;i<len;i++){
All=max(a[i],Start+a[i],All);
Start=max(a[i],a[i]+Start); //if start<0, start=a[i]
}
System.out.println("maxSubArraySum="+All);
}
static int max(int x,int...y){
int max=x;
for(int i:y){
if(i>max){
max=i;
}
}
return max;
}
static void maxSubArraySum(int[] a){
int len=a.length;
int sum=0;
int max=0;
int lastIndex=-1;
for(int i=0;i<len;i++){
if(sum<=0){
sum=a[i];
}else{
sum+=a[i];
}
if(sum>max){
max=sum;
lastIndex=i;
}
}
System.out.println("maxSubArraySum="+max);
if(lastIndex!=-1){
System.out.println("and the subArray is:");
//print the sub array
int i=lastIndex;
while(i>=0&&sum>=0){
sum-=a[i];
i--;
}
for(int j=i;j<=lastIndex;j++){
System.out.print(a[j]+" ");
}
}
}
/*下面这个方法是编程之美里面在讲二维数组的子数组最大和时候提到的:
p[0]=a[0],
p[i]=p[i-1]+a[i]=a[0]+a[1]+...a[i],1<=i<=(n-1)
那么
a[i]+a[i+1]+...a[j]=p[j]-p[i-1]
子数组和最大值为max(p[j]-p[i]),0<=(i,j)<=(n-1)
*/
static void maxSubArraySum3(int[] a){
//略去参数检查
boolean allNegative=true;
int len=a.length;
int[] p=new int[len];
for(int i=0;i<len;i++){
if(allNegative){
if(a[i]>0){
allNegative=false;
}
}
if(i==0){
p[0]=a[0];
}else{
p[i]=p[i-1]+a[i];
}
}
if(allNegative){
System.out.println("maxSubArraySum=0");
}else{
int max=p[0];
int min=p[0];
for(int i=0;i<len;i++){
if(p[i]>max){
max=p[i];
}
if(p[i]<min){
min=p[i];
}
}
System.out.println("maxSubArraySum="+(max-min));
}
}
}
分享到:
相关推荐
使用C3P0额外依赖的一个jar包 :mchange-commons-java-0.2.3.4.jar
46.java数组遍历1.zip46.java数组遍历1.zip46.java数组遍历1.zip46.java数组遍历1.zip46.java数组遍历1.zip46.java数组遍历1.zip46.java数组遍历1.zip46.java数组遍历1.zip46.java数组遍历1.zip46.java数组遍历1.zip...
43.java数组定义1.zip43.java数组定义1.zip43.java数组定义1.zip43.java数组定义1.zip43.java数组定义1.zip43.java数组定义1.zip43.java数组定义1.zip43.java数组定义1.zip43.java数组定义1.zip43.java数组定义1.zip...
22.java数组的复制.zip22.java数组的复制.zip22.java数组的复制.zip22.java数组的复制.zip22.java数组的复制.zip22.java数组的复制.zip22.java数组的复制.zip22.java数组的复制.zip22.java数组的复制.zip22.java数组...
20.java数组空间分配.zip20.java数组空间分配.zip20.java数组空间分配.zip20.java数组空间分配.zip20.java数组空间分配.zip20.java数组空间分配.zip20.java数组空间分配.zip20.java数组空间分配.zip20.java数组空间...
java -jar baksmali-2.0.3.jar -x a.odex \\a.odex喂odex文件的文件名在键入命令前务必正确安装JDK和配置环境变量 <a.odex>处是你要分解的odex文件的名字,命令完成之后,会生成一个out文件夹,里面就是所有的...
C3P0连接池依赖包,连接mysql要用到的2个包之一。
45.java数组动态初始化.zip45.java数组动态初始化.zip45.java数组动态初始化.zip45.java数组动态初始化.zip45.java数组动态初始化.zip45.java数组动态初始化.zip45.java数组动态初始化.zip45.java数组动态初始化.zip...
44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip...
mysql 的jdbc 驱动。mysql-connector-java-5.1.38-bin.jar
jdbc的驱动jar包,有需要的童鞋自取。
25.对象数组.zip25.对象数组.zip25.对象数组.zip25.对象数组.zip25.对象数组.zip25.对象数组.zip25.对象数组.zip25.对象数组.zip25.对象数组.zip25.对象数组.zip25.对象数组.zip25.对象数组.zip25.对象数组.zip25....
官方(http://www.mysql.com/downloads/)下载的最新版本
【IT十八掌徐培成】Java基础第03天-06.二维数组-三维数组-循环遍历.zip
Java中数组实例---一维数组.pdf 学习资料 复习资料 教学资源
Java-Leetcode-乘积最大子数组.zip
mysql 数据库 JDBC驱动包 mysql-connector-java-5.1.7-bin.jar
java-c语法8---数组的数组1 java视频 马克java社区 马克towin
spring 3.2.4 Realease 的所有jar包: spring-context-3.2.4.RELEASE.jar spring-core-3.2.4.RELEASE.jar spring-beans-3.2.4.RELEASE.jar spring-test-3.2.4.RELEASE.jar spring-web-3.2.4.RELEASE.jar ...
计算机后端-Java-Java核心基础-第08章 数组 10. 算法:数组的复制.avi