輸入一個整形數組(可能有正數和負數),求數組中連續子數組(最少有一個元素)的最大和。要求時間復雜度為O(n)。
輸入描述:
【重要】第一行為數組的長度N(N>=1)
接下來N行,每行一個數,代表數組的N個元素
輸出描述:
最大和的結果
輸入例子1:
8 1 -2 3 10 -4 7 2 -5
輸出例子1:
18
思路:對輸入的數組進行計算,
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int inputSize = in.nextInt();
int[] array = new int[inputSize];
for(int i=0;i<array.length;i++){
array[i] = in.nextInt();
}
System.out.println(findMax(array,array[0]));
}
public static int findMax(int[]array,int maxSum){
int localSum = 0;//存儲當前的可能是目標子集的元素和
int inputSize = array.length;
for(int i =0;i<inputSize;i++){
if(array[i]>0){//如果當前的元素大於0,則把它的值加入當前目標子集的和
if(localSum<0){//如果localSum小於0,那么當前的子集必然不會構成目標子集
localSum=0;
}
localSum+=array[i];
}else {//如果當前的元素小於0,則要判斷localSum是否大於0,如果大於0,則加入當前元素值(因為之后可能仍然有很大的數)
if(localSum>0){
localSum+=array[i];
}else{//如果localSum小於0,說明之前的一些元素有比較大的負數,那么就從當前位置開始重新尋找,
localSum = array[i];
}
}
if(maxSum < localSum){
maxSum = localSum;
}
}
return maxSum;
}
}