要求時間復雜度為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);
}
}