一个数组中和最大的连续子数组,第一种粗暴的求出每一个子数组的和,再比较。
package helloworld;
import java.util.*;
public class Test {
public static void main(String[] args) {
int[] str = { 1, 2, -1, 3, -3, 4, -4, 3, -2, 3 };
int maxsum = 0;
int cursum = 0;
int m = 0;//m,n用来保存最大和的起止下标
int n = 0;
for (int i = 0; i < str.length; i++) {
for (int j = i; j < str.length; j++) {
for (int k = i; k < j; k++) {
cursum += str[k];//每个子数组的和
}
if (cursum >maxsum) {
maxsum = cursum;
m = i;
n = j;
}
cursum = 0;//cursum清零,不然最后加的就是全部子数组的和
}
}
System.out.println(maxsum);
for (int k = m; k < n; k++) {
System.out.print(str[k] + " ");
}
}
}
输出:
6
1 2 -1 3 -3 4
另一种时间复杂度为o(n),
package helloworld;
import java.util.*;
public class Test {
public static void main(String[] args) {
int[] str = { 1, 2, -1, 3, -3, 4, -4, 3, -2, 3 };
int cursum = 0;
int maxsum = 0;
for (int i = 0; i < str.length; i++) {//遍历数组
if (cursum <= 0) {//当前和小于0时,直接放弃cursum
cursum = str[i];//cursum直接赋值为str[i]
} else {
cursum += str[i];//否则cursum向后加,后面的有可能更大
}
if (cursum > maxsum) {//将每次最新的cursum与maxsum比较
maxsum = cursum;//maxsum总是保存最大的子数组的和
}
}
System.out.println(maxsum);
}
}
输出:
6