分治——最大子数组问题
来源:互联网 发布:遭受网络攻击 损失 编辑:程序博客网 时间:2024/06/06 19:08
代码
public class Max { private static int max ( int [] a, int left, int right ){ //如果只有一个元素 if ( left == right ) if ( a[left] > 0 ) return a[left]; else return 0; //以下分解递归 int mid = ( left + right ) / 2; int leftSum = max( a, left, mid ); int rightSum = max( a, mid + 1, right ); //求跨越中轴的最大值 int leftMax = 0, leftBorder = 0; for ( int i = mid; i >= left; i--) { leftBorder += a[i]; if ( leftBorder > leftMax ) leftMax = leftBorder; } int rightMax = 0, rightBorder = 0; for ( int i = mid + 1; i <= right; i++) { rightBorder += a[i]; if ( rightBorder > rightMax ) rightMax = rightBorder; } int crossingSum = leftMax + rightMax; //返回三者最大值 return max3( crossingSum, leftSum, rightSum ); } private static int max3( int crossingSum, int leftSum, int rightSum ) { int max = leftSum > rightSum ? leftSum : rightSum; max = max > crossingSum ? max : crossingSum; return max; } //测试 public static void main( String [] args) { int [] a = { 4, -3, 5, -2, -1, 2, 6, -2}; System.out.print( max( a, 0, a.length - 1 ) ); }}
输出结果
11
分治算法简要分析
列出递归式 T(n) = 2T(n/2) + θ(n) ,
可以使用递归树、主方法等算出时间即 θ(n log n),不再赘述。
阅读全文
0 0
- 分治——最大子数组问题
- 分治策略——最大子数组问题
- 分治法——最大子数组
- 分治法解决最大子数组问题
- 【算法设计-分治】最大子数组问题
- 分治策略之最大子数组问题
- 【分治策略】最大子数组问题
- 分治法求解最大子数组问题
- 分治算法-最大子数组问题
- 分治策略求解最大子数组问题
- 分治策略之最大子数组问题
- 分治法求解最大子数组问题
- 分治法-最大子数组问题
- 分治法求最大子数组问题
- 分治策略-最大子数组问题
- 分治策略之最大子数组问题
- 分治策略 | 最大子数组问题
- 分治策略之最大子数组问题
- poj1011Sticks(搜索+剪枝)
- 微信小程序数据绑定和简单的运算
- struts2文件下载
- C++常用数据类型
- 工作线程数究竟要设置为多少
- 分治——最大子数组问题
- 文章标题
- 欢迎使用CSDN-markdown编辑器
- es6
- FFmpeg安装及encode库的安装说明
- 开启vue大门
- MySQL-范式与反范式
- 1951: [Sdoi2010]古代猪文
- 在纪中的第六天,2017-7-12 总结: