求子陣列的和的最大值

2021-10-01 02:20:27 字數 1178 閱讀 1646

一、題目

輸入乙個整型陣列,陣列裡有正數也有負數。陣列中乙個或連續的多個整數組成乙個子陣列。求所有子陣列的和的最大值。要求時間複雜度為o(n)。

例子說明:

例如輸入的陣列為,和最大的子陣列為{3, 10, -4, 7, 2}。因此輸出為該子陣列的和18 。

二、解題思路

舉例分析陣列的規律。

我們試著從頭到尾逐個累加示例陣列中的每個數字。初始化和為0。第一步加上第乙個數字1, 此時和為1。接下來第二步加上數字-2,和就變成了-1。第三步刷上數字3。我們注意到由於此前累計的和是-1 ,小於0,那如果用-1 加上3 ,得到的和是2 , 比3 本身還小。也就是說從第乙個數字開始的子陣列的和會小於從第三個數字開始的子陣列的和。因此我們不用考慮從第乙個數字開始的子陣列,之前累計的和也被拋棄。

我們從第三個數字重新開始累加,此時得到的和是3 。接下來第四步加10,得到和為13 。第五步加上-4, 和為9。我們發現由於-4 是乙個負數,因此累加-4 之後得到的和比原來的和還要小。因此我們要把之前得到的和13 儲存下來,它有可能是最大的子陣列的和。第六步加上數字7,9 加7 的結果是16,此時和比之前最大的和13 還要大, 把最大的子陣列的和由13更新為16。第七步加上2,累加得到的和為18,同時我們也要更新最大子陣列的和。第八步加上最後乙個數字-5,由於得到的和為13 ,小於此前最大的和18,因此最終最大的子陣列的和為18 ,對應的子陣列是{3, 10, -4, 7, 2}。

public static int findgreatestsumofsubarray(int array) 

// sum為當前子陣列的和

int sum = 0;

// max為子陣列的最大和

int max = 0;

// 最大子陣列的起始位置

int startpos = 0;

// 最大子陣列的結束位置

int endpos = 0;

for (int i = 0; i < array.length; i++)

if (sum > max)

}system.out.println("max:" + max);

system.out.println("startpos:" + startpos + ",endpos:" + (endpos - 1));

return max;

}

求子陣列和的最大值

題目要求 輸入乙個一維整形陣列,陣列裡有正數也有負數。一維陣列首尾相接,像個一條首尾相接帶子一樣。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。程式設計思路 1 首先建立乙個一維陣列a,進行資料儲存。2 定義變數,n用於求和,m為和最大值 3 開始for迴...

erlang 求子陣列和的最大值

前段時間修改為簡單方法 module son export son 1 son a son a,0,0 son max,sum max son head list max,sum new sum head sum,new max case new sum max of true new sum ma...

2 14 求子陣列之和的最大值

include using namespace std int maxsum int src,int n,int spos,int epos else if start all return all int max int a,int b,int c else void toneg int src,...