最大子陣列和四種實現

2021-10-10 09:40:49 字數 2261 閱讀 1278

暴力列舉

/**

* 暴力列舉的方式 時間複雜度o(n^3)

** @param array 輸入

* @return 最大子陣列的和的值

*/public

static

intforcemaxsubarray

(int

array)

if(sum > maxvalue)}}

return maxvalue;

}

優化的暴力列舉

/**

* 優化的暴力列舉 時間複雜度o(n^2)

** @param array 輸入

* @return 最大子陣列的和的值

*/public

static

intoptimizeforcesubarray

(int

array)}}

return maxvalue;

}

分治法

/**

* 分治法 時間複雜度 o(n*log^n)

** @param array 輸入

* @param left 左邊界

* @param right 右邊界

* @return 最大子陣列的值

*/public

static

intdividemaxsubarray

(int

array,

int left,

int right)

else

}/**

* 計算跨中間點的最大陣列

** @param array 輸入

* @param left 左邊界

* @param right 右邊界

* @return 跨中間節點最大子陣列的值

*/private

static

intcrossmidvalue

(int

array,

int left,

int right)

}int rightvalue = integer.min_value;

sum =0;

/* * 這裡左邊的範圍必須和上面一樣 mid+1 ~ right

*/for(

int i = mid +

1; i <= right; i++)}

// 返回跨越中間的最大陣列值 ------ 左邊加右邊

return leftvalue + rightvalue;

}/**

* 返回三個數的最大值

** @param leftmaxvalue 左陣列的最大值

* @param rightmaxvalue 右陣列最大值

* @param midmaxvalue 跨中間的最大值

* @return 最大值

*/private

static

intmax

(int leftmaxvalue,

int rightmaxvalue,

int midmaxvalue)

動態規劃

/**

* 動態規劃 時間複雜度o(n)

* @param array 輸入的陣列

*/private

static

void

getsumofsubarray05

(int

array)

else

if(ev[i]

> max)

} system.out.

println

(arrays.

tostring

(ev));

// 取出陣列中最大的數

system.out.

println

("最大子陣列之和為:"

+ arrays.

stream

(ev)

.max()

.getasint()

);system.out.

println

("範圍是:["

+iv[endindex]

+"~"

+endindex+

"]")

;}

最大子段和四種求法

給定n 1 n 100000 個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的子段和的最大值。當所給的整數均為負數時定義子段和為0,依此定義,所求的最優值為 max,1 i j n。例如,當 a 1 a 2 a 3 a 4 a 5 a 6 2,1...

最大子段和四種求法

給定n 1 n 100000 個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的子段和的最大值。當所給的整數均為負數時定義子段和為0,依此定義,所求的最優值為 max,1 i j n。例如,當 a 1 a 2 a 3 a 4 a 5 a 6 2,1...

最大子串行和的四種演算法

1.窮舉法 演算法思想 算出每個子串行的和,即算出序列中第i個到第j個數的和 j i 並進行比較 演算法 public static int maxsubsum1 int a if sum maxsum return maxsum 執行時間為o n 3 2.對上述第乙個演算法的改進 演算法思想 第乙...