算法导论第三章
2017-09-16 12:48
134 查看
最大子数组
package com.gds.algorithms; public class Tuple { private int leftIndex; private int rightIndex; private int sum; public Tuple(int leftIndex, int rightIndex, int sum) { this.leftIndex = leftIndex; this.rightIndex = rightIndex; this.sum = sum; } /** * @return the leftIndex */ public int getLeftIndex() { return leftIndex; } /** * @param leftIndex the leftIndex to set */ public void setLeftIndex(int leftIndex) { this.leftIndex = leftIndex; } /** * @return the rightIndex */ public int getRightIndex() { return rightIndex; } /** * @param rightIndex the rightIndex to set */ public void setRightIndex(int rightIndex) { this.rightIndex = rightIndex; } /** * @return the sum */ public int getSum() { return sum; } /** * @param sum the sum to set */ public void setSum(int sum) { this.sum = sum; } }
package com.gds.algorithms; public class FindSubarray { public static Tuple findMaxCrossingSubarray(int[] A, int low, int mid, int high) { int leftSum = Integer.MIN_VALUE; int sum1 = 0; int maxLeft = 0; for (int i=mid; i >= low; i--) { sum1 = sum1 + A[i]; if (sum1 > leftSum) { leftSum = sum1; maxLeft = i; } } int rightSum = Integer.MIN_VALUE; int sum2 = 0; int maxRight = 0; for (int j = mid+1; j <= high; j++) { sum2 = sum2 + A[j]; if (sum2 > rightSum) { rightSum = sum2; maxRight = j; } } Tuple t1 = new Tuple(maxLeft, maxRight, leftSum + rightSum); return t1; } public static Tuple findMaximumSubarray(int[] A, int low, int high) { Tuple t = null; if (high == low) { t = new Tuple(low, high, A[low]); return t; } else { int mid = Math.floorDiv(low+high, 2); int leftLow = findMaximumSubarray(A, low, mid).getLeftIndex(); int leftHigh = findMaximumSubarray(A, low, mid).getRightIndex(); int leftSum = findMaximumSubarray(A, low, mid).getSum(); int rightLow = findMaximumSubarray(A, mid+1, high).getLeftIndex(); int rightHigh = findMaximumSubarray(A, mid+1, high).getRightIndex(); int rightSum = findMaximumSubarray(A, mid+1, high).getSum(); int crossLow = findMaxCrossingSubarray(A, low, mid, high).getLeftIndex(); int crossHigh =findMaxCrossingSubarray(A, low, mid, high).getRightIndex(); int crossSum = findMaxCrossingSubarray(A, low, mid, high).getSum(); if (leftSum >= rightSum && leftSum >= crossSum) { t = new Tuple(leftLow, leftHigh, leftSum); return t; } else if (rightSum >= leftSum && rightSum >= crossSum) { t = new Tuple(rightLow, rightHigh, rightSum); return t; } else { t = new Tuple(crossLow, crossHigh, crossSum); return t; } } } public static void main(String[] args) { int[] A = {13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7}; Tuple t = findMaximumSubarray(A, 0, A.length-1); int low = t.getLeftIndex(); int high = t.getRightIndex(); int sum = t.getSum(); System.out.println("low: "+ low + "\n" + "high: " + high + "\n" + "sum: " + sum); } }
相关文章推荐
- 《算法导论》笔记系列之第三章函数的增长
- 《算法导论》课后题--4--第三章
- 《算法导论》学习总结 — 2.第一章 && 第二章 && 第三章
- 算法导论第三章 最大子数组
- 算法导论第三章习题答案(第三版) Introduction to Algorithm
- 算法导论第三章总结
- 算法导论第三章笔记
- 算法导论第三章 学习笔记
- 算法导论第三章--- 渐进记号
- 《算法导论》第三章-第1节_练习(参考答案)
- 算法导论课后习题解析 第三章
- 算法导论第三章函数的增长问题研究
- 算法导论 学习笔记 第三章 函数的增长
- 算法导论 第三章 函数的增长 3.2习题个人解答
- 《算法导论》第三章-第2节_练习(参考答案)
- 算法导论第三章_函数的增长_读书笔记
- 算法导论详解(2) 第三章函数的增长
- 算法导论第三章_函数的增长_读书笔记
- 《算法导论》系列课后思考题之-第三章《函数的增长》(下)
- 《算法导论》读书笔记--第三章 函数的增长