算法导论:最大子数组问题(java实现)
2018-02-06 19:21
435 查看
import java.util.*; public class Main{ public static void main(String[] args) { Scanner in = new Scanner(System.in); int n; n = in.nextInt(); int[] a = new int ; int[] b = new int ; for(int i=0;i<n;i++) { a[i] = in.nextInt(); } for(int i=1;i<n;i++) { b[i] = a[i] - a[i-1]; } b[0] = 0; int[] result = subarray(b,1,n); for(int e:result) System.out.print(e+" "); } public static int[] crossSubarray(int[] a,int p,int q,int r) { int left_sum = -100000; int sum = 0; int left_max=p; for(int i=q-1;i>=p-1;i--) { sum = sum+a[i]; if(sum>left_sum) { left_sum = sum; left_max = i; } } int right_sum = -100000; sum = 0; int right_max=q; for(int i=q;i<=r-1;i++) { sum = sum+a[i]; if(sum>right_sum) { right_sum = sum; right_max = i; } } int[] result = {left_max,right_max,left_sum+right_sum}; return result; } public static int[] subarray(int[] a,int p,int r) { if(p==r) { int[] x = {p,r,a[r-1]}; return x; } else { int q = (p+r)/2; int[] x1 = subarray(a,p,q); int[] x2 = subarray(a,q+1,r); int[] x3 = crossSubarray(a,p,q,r); if(x1[2]>=x2[2]&&x1[2]>=x3[2]) return x1; if(x2[2]>=x1[2]&&x2[2]>=x3[2]) return x2; else return x3; } } }
相关文章推荐
- 用分治法实现最大子数组问题(Java)
- 用暴力求解法和分而治之法求解最大子数组问题的Java代码实现
- 一维数组及子数组最大和问题Java实现
- 最大子数组问题分治法(递归)Java实现
- 数组问题之一维最大字段和问题<Java实现>
- 最大子数组问题(三种方式,java实现)
- 第四章 最大子数组问题(股票最大收益) C++实现 算法导论
- 算法导论书,page41,最大子数组,java代码实现
- 算法导论-最大子数组问题-线性时间复杂度算法分析与实现
- 数字问题之最大公约数问题全解法归纳<Java实现>
- 从n个数组中任意选取一个元素的所有组合的Java实现(组合问题)
- 最大子数组java实现
- 数组求最大最小值和排序java实现
- 算法导论C语言实现: 分治策略 -- 最大子数组问题
- [leetcode]分治法求解最大子序列问题——Java实现
- 算法java实现--回溯法--最大团问题
- java实现最大子序列问题——————性能最优的算法
- 三种算法实现最大子段和问题(Java实现)
- [java实现]找一个数组的最大和的连续子数组(时间复杂度 O(n))
- 算法导论_最大子数组问题(分治策略)