輸入一個整形數組(可能有正數和負數),求數組中連續子數組(最少有一個元素)的最大和。要求時間復雜度為O(n)(解決)


輸入一個整形數組(可能有正數和負數),求數組中連續子數組(最少有一個元素)的最大和。要求時間復雜度為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;
  }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM