java 最大子数组_Java求数组的子数组之和的最大值

[java]代码库// 输入一个整形数组,数组里有正数也有负数。

// 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

// 求所有子数组的和的最大值。要求时间复杂度为O(n)。

public class Test

{

static int[] arr =

{

1, -2, 3, 10, -4, 7, 2, -5

};// 需要求的数组

static int maxIndex = arr.length - 1;// 数组的最大下标

public static void main(String[] args)

{

findMaxArr2();

System.out.println("\n-------------");

findMaxArr3();

}

// 1.三层for循环求解

// 2.二层for循环求解

static void findMaxArr2()

{

int max = arr[0];// 最大值

int sum;// 求和

int startIndex = 0;

int endIndex = 0;

for (int i = 0; i <= maxIndex; i++)

{

sum = 0;

for (int j = i; j <= maxIndex; j++)

{

sum += arr[j];

if (sum > max)

{

max = sum;

startIndex = i;

endIndex = j;

}

}

}

System.out.println("最大值为:" + max);

printArr(startIndex, endIndex);

}

// 3.时间复杂度为n

static void findMaxArr3()

{

int max = arr[0];// 最大值

int sum = 0;// 求和

int startIndex = 0;

int endIndex = 0;

for (int i = 0; i <= maxIndex; i++)

{

if (sum >= 0)

{

sum += arr[i];

}

else

{

sum = arr[i];

startIndex = i;// 最大子数组开始值

}

if (sum > max)

{

max = sum;

endIndex = i;// 最大子数组结束值

}

}

System.out.println("最大值为:" + max);

printArr(startIndex, endIndex);

}

// 根据下标开始结束值,打印数组

static void printArr(int startIndex, int endIndex)

{

for (int i = startIndex; i <= endIndex; i++)

{

System.out.print(arr[i] + " ");

}

}

}

//源代码片段来自云代码http://yuncode.net

694748ed64b9390909c0d88230893790.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值