最大子数组问题-分治策略解法
2018-04-02 18:52
260 查看
import java.util.Random; import java.util.Scanner; /* * 最大子数组问题-分治策略解法 */ public class MaxSubArray { static class Data { int low; int high; int num; public Data(int low, int high, int num) { super(); this.low = low; this.high = high; this.num = num; } public Data() { super(); } } public static void main(String[] args) { Random random = new Random(); int n; Scanner sc = new Scanner(System.in); n = sc.nextInt(); int[] arr = new int ; for (int i = 0; i < n; i++) { arr[i] = random.nextInt() % 50; System.out.print(arr[i] + " "); } Data data = findMaximumSubArray(arr, 0, arr.length - 1); System.out.println("\n" + (data.low + 1) + " " + (data.high + 1) + " " + data.num); } private static Data findMaximumSubArray(int[] arr, int low, int high) { if (low >= high) { return new Data(low, high, arr[low]); } int mid = (low + high) / 2; Data dataLeft = findMaximumSubArray(arr, low, mid); Data dataRight = findMaximumSubArray(arr, low, mid); Data dataCross = findMaxCrossingSubArray(arr, low, mid, high); if (dataLeft.num > dataRight.num && dataLeft.num > dataCross.num) { return dataLeft; } else if (dataRight.num > dataLeft.num && dataRight.num > dataCross.num) { return dataRight; } else { return dataCross; } } private static Data findMaxCrossingSubArray(int[] arr, int low, int mid, int high) { Data data = new Data(); int num = 0; int maxNumLeft = Integer.MIN_VALUE; int maxLeftIndex = mid; for (int i = mid; i >= low; i--) { num += arr[i]; if (num > maxNumLeft) { maxNumLeft = num; maxLeftIndex = i; } } num = 0; int maxNumRight = Integer.MIN_VALUE; int maxRightIndex = mid + 1; for (int i = mid + 1; i <= high; i++) { num += arr[i]; if (num > maxNumRight) { maxNumRight = num; maxRightIndex = i; } } data.low = maxLeftIndex; data.high = maxRightIndex; data.num = maxNumLeft + maxNumRight; return data; } }
相关文章推荐
- 第四章 分治策略 最大子数组问题
- 最大子数组问题的线性解法-wikipedia
- 算法导论--分治策略求解最大子数组问题
- 算法导论_最大子数组问题(分治策略)
- [算法导论-分治策略]求最大子数组之各种解法及源代码实现
- T(n) = O(n) 的最大子数组问题解法
- 分治策略解决最大子数组问题
- 分治策略-最大子数组问题
- 算法导论-----最大子数组问题(线性解法)
- 【分治策略】最大子数组问题
- 分治策略求解最大子数组问题
- 最大子数组问题的三种解法
- 求连续子数组最大和问题的两种解法_PHP实现
- 分治策略之最大子数组问题
- 分治策略之最大子数组问题
- 算法导论 最大子数组问题(分治策略)
- 分治策略 & 最大子数组的问题
- 最大子数组问题(分治策略实现)
- 分治策略__解决最大连续子数组的问题
- 算法导论_最大子数组问题(分治策略)