最大子序列求和问题(1)-解法之一分治法
2012-05-10 00:21
387 查看
(一)问题提出
求序列和的最大值
求序列和的最大值
/** * 求最大序列和 */ public class CMaxSumUtils { /* * 算法一 */ public static int maxSum(int[] a, int left, int right) { //当‘分’,数据项只有一项时 if (left == right) {//递归的基准 if(a[left] > 0) { return a[left]; } else {//如果为负,则抛弃此项数据,从后再计算 return 0; } } //‘分’ int center = (left + right) / 2; //递归求解 int maxLeftSum = maxSum(a, left, center); int maxRightSum = maxSum(a, center + 1, right); /** * 例: * 当子问题为[-1 2],求得以下 * maxLeft=-1,maxRight=2,max横跨左右=-1 + 2 * 当取 3者最大解 */ int maxLeftBorderSum = 0; int leftBorderSum = 0; for(int i = center; i >= left; i--) { leftBorderSum += a[i]; if(leftBorderSum > maxLeftBorderSum) { maxLeftBorderSum = leftBorderSum; } } int maxRightBorderSum = 0; int rightBorderSum = 0; for(int i = center + 1; i <= right; i++) { rightBorderSum += a[i]; if(rightBorderSum > maxRightBorderSum) { maxRightBorderSum = rightBorderSum; } } return max(maxLeftSum, maxRightSum, maxLeftBorderSum + maxRightBorderSum ); } private static int max(int a1, int a2, int a3) { int max = 0; if(a1 > max) { max = a1; } if(a2 > max) { max = a2; } if(a3 > max) { max = a3; } return max; } public static void main(String[] args) { int[] a = {-1, 2, -7, 5}; System.out.println(maxSum(a, 0, a.length - 1)); } }
相关文章推荐
- 最大子序列求和问题
- 数据结构和算法学习系列之最大子序列求和问题的O(N)时间复杂度
- [C++]四种方式求解最大子序列求和问题
- 最大子序列求和问题
- 最大公共子序列求和问题(MCSS)
- java 之连续子序列最大和问题的四个解法
- 使用分治法解最大连续子序列和问题
- 分治法和动态规划法解最大子序列问题 C++
- [C++]四种方式求解最大子序列求和问题
- 分治法求最大子序列和问题
- 最大子序列求和问题
- 最大连续子序列和问题O(n)解法
- 求和最大的连续子序列问题分…
- 用分治法求最大子序列问题,时间复杂度O(N*logN)
- [leetcode]分治法求解最大子序列问题——Java实现
- 【数据结构和算法分析】最大子序列求和问题及联机算法
- 最大子序列求和问题
- 最大子序列求和问题
- 最大子序列求和问题
- [算法学习笔记]分治法——最大子序列和问题