歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 線性實現最大子序列和

線性實現最大子序列和

日期:2017/3/1 9:13:44   编辑:Linux編程

要求時間復雜度為O(n),實現最大子序列的和,並找到最大序列的起始位置和終止位置。例如輸入的數組為1, -2, 3, 10, -4, 7, 2, -5,最大子序列為3, 10, -4, 7, 2, 因此輸出為該子數組的和18,開始位置為2,終止位置為6。dp[i]=max{num[i],dp[i-1]},其中dp[i]表示以i為末尾節點的最大子序列和,具體看接下來的代碼,我這邊已經寫的很詳細了。如果大家都什麼好的優化或者有什麼沒考慮到的還請大家積極指出。

package TestProject;

import java.util.Scanner;
/**
 * 最大子序列的和,時間復雜度為O(n),可以查詢出最大子序列的開始位置、截止位置、值
 * @author xuhui
 *
 */
public class MaxSubArray {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int len = scanner.nextInt();//輸入序列的長度
        int[] num = new int[len];//初始化數組
        int[] dp = new int[len];
        for(int i=0;i<len;i++){
            num[i] = scanner.nextInt();
            dp[i] = num[i];
        }
        int begin = 0;//記錄最大序列開始位置
        int s = 0;//記錄序列子序列的起始位置
        int end = 0;//記錄最大序列結束的位置
        int max_sum = dp[0];//最大序列的和
        for(int i=1;i<len;i++){//更新以i為末尾節點的最大最序列值dp[i]=max{num[i],dp[i-1]+num[i]}
            if(dp[i]<=(dp[i-1]+num[i])){
                dp[i]=dp[i-1]+num[i];
            }else{//保證末尾節點為i最大子序列的起始位置
                s=i;
            }
            if(dp[i]>max_sum){
                max_sum = dp[i];
                end = i;
                begin = s;
            }
        }
        System.out.print("begin:"+begin+" end:"+end+" max_sum:"+max_sum);
    }
    
    
}

Copyright © Linux教程網 All Rights Reserved