求数组的子数组和最大值
2011-12-19 17:06
337 查看
用Java实现的,有兴趣的自己瞅瞅吧..
public class main { /** * @param args */ public static int MaxSubArraySum(int[] array,int length) { if(length == 0) return 0; int sum = Integer.MIN_VALUE, cur_sum = array[0]; for(int i = 1; i < length; i++) { if(cur_sum < 0) cur_sum = 0; cur_sum = cur_sum + array[i]; if(sum < cur_sum) { sum = cur_sum; } } return sum; } public static int MaxSubArray(int[] array,int length) { if(length == 0) return 0; int sum = Integer.MIN_VALUE, cur_sum = array[0]; int start = 0, end = 0, tmp = 0; for(int i = 1; i < length; i++) { if(cur_sum < 0) { cur_sum = 0; tmp = i; } cur_sum = cur_sum + array[i]; if(sum < cur_sum) { sum = cur_sum; start = tmp; end = i; } } System.out.println("MaxSubArray:"+start + " "+end); return sum; } public static int Brute_Force_Max_SubArray(int[] array,int length) { if(length == 0) return 0; int sum = Integer.MIN_VALUE,cur_sum = 0; int start = 0,end = 0; for(int i = 0; i < length; i++) { cur_sum = 0; for(int j = i; j < length; j++) { cur_sum += array[j]; if(cur_sum > sum) { sum = cur_sum; start = i; end = j; } } } System.out.println("Brute_Force_Max_SubArray:"+start + " "+end); return sum; } public static int Max_SubArray_Ring(int[] array,int length) //首尾相连 { int sum_nonering = MaxSubArraySum(array,length); //先考虑首尾不相连的最大值 int left = 0,leftsum = Integer.MIN_VALUE, leftcur_sum = 0; for(int i = 0; i < length; i++) { leftcur_sum = leftcur_sum + array[i]; if(leftsum < leftcur_sum) { leftsum = leftcur_sum; left = i; } } int right = 0, rightsum = Integer.MIN_VALUE, rightcur_sum = 0; for(int i = length-1; i >= 0; i--) { rightcur_sum = rightcur_sum + array[i]; if(rightsum < rightcur_sum) { rightsum = rightcur_sum; right = i; } } if(left < right) { if(sum_nonering < (leftsum+rightsum)) return (leftsum+rightsum); else return sum_nonering; } else { int minStart=0; int minAll=0; for(int i=0;i<length;i++) //计算子数组最小值 { if(minStart > 0) minStart = 0; minStart = array[i] + minStart; if(minAll > minStart) minAll = minStart; } int ringsum = leftsum+rightsum; for(int i = right; i <= left; i++) //删除重复计算的元素,得到数组的全和 ringsum = ringsum - array[i]; int maxsum_ring = ringsum - minAll; if(sum_nonering < maxsum_ring) return maxsum_ring; else return sum_nonering; } } public static void main(String[] args) { // TODO Auto-generated method stub int[] array = {3,-2,3}; System.out.println("result:"+MaxSubArraySum(array,array.length)); System.out.println("result:"+MaxSubArray(array,array.length)); System.out.println("result:"+Brute_Force_Max_SubArray(array,array.length)); System.out.println("result_ring:"+Max_SubArray_Ring(array,array.length)); return; } }
相关文章推荐
- 环形二维子数组求最大子数组
- 求每个元素之和为最大的给定数组的子数组
- 求整数数组中和最大的子数组
- 求数组最大子数组
- 求无序数组中(max+min)最大的子数组
- 长度为n的数组有正有负,找出元素之和最大的子数组
- 求数值型数组的子数组和最大值
- 求无序数组的(max+min)最大的子数组
- 数组、求和最大的子数组
- 获取数组最大连续增长子数组
- 求数组和最大的子数组
- 求数组中和最大的子数组
- 求二维数组中子数组和中最大的值,及子数组
- 关于如何查找数组中和最大的子数组
- java笔试题:数组查找,查找和为最大的子数组
- 求给定数组的最大子数组
- 【编程练习】求数组和最大的子数组
- 求数组的一个和最大的子数组
- 求二维整形数组的子数组的和最大的子数组
- 数组中最大和的子数组