以下三种实现方法不同,时间复杂度分别为N3,N2,N
public class MaxSonArr{
//三重For循环
public static int maxSonArr(int[] arr){
int maxSum = 0;
for (int i = 0; i < arr.length; i++) {//i:子序列第一个数的位置
for (int j = i; j < arr.length; j++) {//j:子序列长度
int sum = 0;
for (int k = i; k <= j; k++) {//累加;其实没必要,因为条件和第二层for循环实际上一摸一样的
sum += arr[k];
}
if(maxSum<sum){
maxSum = sum;
}
}
}
return maxSum;
}
//二重For循环
public static int maxSonArr2(int[] arr){
int maxSum = 0;
for (int i = 0; i < arr.length; i++) {//i:子序列第一个数的位置
int sum = 0;
for (int j = i; j < arr.length; j++) {//j:子序列长度
sum += arr[j];
if(maxSum<sum){
maxSum = sum;
}
}
}
return maxSum;
}
//一重For循环
public static int maxSonArr3(int[] arr){
int maxSum = 0;
int sum = 0;
//由于不需要知道
for (int j = 0; j < arr.length; j++) {
sum += arr[j];
if(maxSum<sum){
maxSum = sum;
}else if(sum<0){//将当前已累加的值看做起点,负值的起点绝对不可能是最佳的,因为你可以将起点向后推进而得到改善
sum=0;
}
}
return maxSum;
}
}
结果:6;