最大連續子陣列

2021-07-15 00:15:30 字數 1897 閱讀 6342

對於乙個給定的陣列a,求 a中連續子陣列,使得該陣列的和最大

例如:

a:1, -2, 3, 10, -4, 7, 2, -5

結果:3 10 -4 7 2

暴力法 — 遍歷求a的所有子陣列,求和最大的

分治法:

陣列的和最大那個陣列只會出現在以下三種情況中:

a. 存在於陣列下標從0到mid中,其中mid為陣列長度(length)的一半

b. 存在於陣列下標從mid到length中

c. 跨越陣列下標mid,且下標mid在和最大陣列中

動態規劃

public

class 最大連續子陣列 ;

// 1.暴力法--遍歷

// f1(array);

// 2. 分治法--先分然後在處理

// int res = f2(array, 0, array.length - 1);

// 3. 動態規劃

int res = f3(array, 0, array.length - 1);

system.out.println("子陣列:");

for (int i = from; i <= to; i++)

system.out.println("\n和:\n" + res);

}// 3. 動態規劃

// s[k+1] = max ( s[k]+a[k+1], a[k+1] ) 要麼繼續連續,要麼斷開

private

static

int f3(int array, int start, int end) else

}return sum;

}private

static

int from;

private

static

int to;

// 2. 分治法

private

static

int f2(int array, int start, int end)

int mid = (start + end) / 2;

int m1 = f2(array, start, mid); // 最大值在前一半

int m2 = f2(array, mid + 1, end); // 最大值在後一半

int mf = array[mid];

int sum = 0;

for (int i = mid; i >= start; i--)

}int mb = array[mid + 1];

sum = 0;

for (int i = mid + 1; i <= end; i++)

}int m3 = mf + mb;

int res = 0;

if (m1 > m2) else

if (res < m3)

return res;

}// 暴力法

private

static

void f1(int array)

if (array.length == 1)

int max = array[0];

int start = 0;

int end = 0;

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

if (sum > max) }}

for (int i = start; i <= end; i++)

system.out.println("\n" + max);

}}

子陣列:

3 10 -4 7 2

和: 18

最大連續子陣列

問題描述,給定乙個陣列a 0,1,n 1 求出a的連續陣列,使得該子陣列的和最大。例如 陣列a 1,2,3,10,4,7,2 則最大的子陣列為 3,10,4,7,2 解法 1.暴力法 2.分治法 3.動態規劃法 一 暴力發 分析 直接求解a i,j 的值,0 i n i j n,i,i 1,j 1的...

最大連續子陣列

題目 給乙個陣列,返回它的最大連續子串行的和 子向量的長度至少是1 例如 連續子向量的最大和為8 從第0個開始,到第3個為止 使用動態規劃 f i 以array i 為末尾元素的子陣列的和的最大值,子陣列的元素的相對位置不變 f i max f i 1 array i array i res 所有子...

最大連續子陣列和

題目描述 輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值,要求時間複雜度為o n 例如輸入的陣列為 1,2,3,10,4,7,2,5 和最大的子陣列為 3,10,4,7,2 因此輸出為該子陣列的和18。思路 採用貪婪法...