暴力列舉
/**
* 暴力列舉的方式 時間複雜度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.對上述第乙個演算法的改進 演算法思想 第乙...