1. 程式人生 > >關於返回一個整數數組中最大子數組的和的問題

關於返回一個整數數組中最大子數組的和的問題

時間 方式 ble i++ 比較 port inf += pac

題目:返回一個整數數組中最大子數組的和

要求:1、輸入一個整形數組,數組裏有正數也有負數。

   2、數組中連續的一個或多個整數組成一個子數組,每個子數組都有一個和。

   3、求所有子數組的和的最大值。要求時間復雜度為O(n)

方法一:剛拿到這個題目時,先沒有考慮時間復雜度的問題,就是想把所有的子數組的和算出來,然後在比較,思路簡單,但循環次數多

package about_bank_account;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        
        Scanner in 
= new Scanner(System.in); int[] A = new int[5];//大數組 int[] B = new int[15]; int temp = 0; int i; int k;//k為行 int t1 = 0;//小數組內循環 int t2 = 0;//記錄小數組內數字個數 int sum = 0;// int j = 0; int max = 0; System.out.println(
"輸入5個數:"); for(i = 0;i < 5;i++) { temp = in.nextInt(); A[i] = temp; } for(k = 0;k < 15;k++) { for(t1 = j;t1 <= t2;t1++) { sum = sum + A[t1]; } t2
++; B[k] = sum; sum = 0; if(t2 == 5) { j = j + 1; t2 = j; } } max = B[0]; for(k = 0;k < 15;k++) { if(max < B[k]) { max = B[k]; } } System.out.print("-------------"+max); } }

技術分享圖片

方法二:先將數組轉化成一正一負(正負相間)的數組,

  若原數組為:

5 -1 -2 1 2

  轉化後數組為:

5 -3 3

  然後在轉化後的數組的基礎上,從第一個數開始,依次加兩個數然後比較,加到最後一位數後,再從第二個數開始加,這樣循環,找出其中最大數

(本方法我沒有具體實現,轉化後數組第一個數字正負不同,加的方式不同)

方法三:把數組的第一個值付給rmax和max,隨後進行循環比較,從正值開始計數,如果一個一個累加起來小於等於零,就將max重新賦值,每次把最大值付給rmax,最後得出子數組的和的最大值。

package about_bank_account;

import java.util.Scanner;

public class Test {
    
    public static void main (String[] args){
        @SuppressWarnings("resource")
        Scanner in=new Scanner(System.in);
        int num[]=new int[5];
        int max=0;
        int rmax=0;
        System.out.println("請輸入五個數:");
        for(int i=0;i<5;i++) {
            num[i]=in.nextInt();
        }
        rmax=num[0];
        for(int i=0;i<5;i++) {
            if(max<=0) {
                max=num[i];
            }else {
                max+=num[i];
            }
            if(rmax<max) {
                rmax=max;
            }
        }
        System.out.println(rmax);     
    }
    
}

技術分享圖片

關於返回一個整數數組中最大子數組的和的問題