给定N个整数的序列,求所有连续子列和中的最大值,若该值小于0,则返回0。
public class MaxSubSeqSum {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int k = scan.nextInt();
int[] arr = new int[k];
for(int i = 0; i < k; i++){
arr[i] = scan.nextInt();
}
Solution s = new Solution();
// int max = s.max1(arr);
// int max = s.max2(arr);
int max = s.max3(arr);
System.out.println(max);
}
}
class Solution{
//方法1 复杂度:O(n^3)
public int max1(int arr[]){
int maxSum = 0;
for (int i = 0; i < arr.length; i++){ //i记录子列开始位置
for (int j = i; j < arr.length;j++){ //j记录子列结束位置
int thisSum = 0;
for (int k = i; k <= j; k ++){ //遍历由i,j确定的子列,求子列和
thisSum += arr[k];
if (thisSum > maxSum){
maxSum = thisSum;
}
}
}
}
return maxSum;
}
//方法2 复杂度:O(n^2)
public int max2(int[] arr){
int maxSum = 0;
for (int i = 0; i < arr.length;i++){
int thisSum = 0;
for (int j = i; j < arr.length;j++){ //j每次都加1,只要在上次的子列和结果上加上第j个元素,就是此次子列和
thisSum += arr[j];
if (thisSum > maxSum){
maxSum = thisSum;
}
}
}
return maxSum;
}
//方法3 实时处理数据,读取一个数据,算一下子列和,复杂度:O(n)
public int max3(int[] arr){
int maxSum = 0;
int thisSum = 0;
for (int i = 0; i < arr.length; i++){
thisSum += arr[i];
if (thisSum < 0){
thisSum = 0; //若当前子列和小于0就抛弃,因为它不会使后面的子列和增加
}
if (thisSum > maxSum){
maxSum = thisSum;
}
}
return maxSum;
}
}