算法导论——最大子数组和
来源:互联网 发布:阿提拉全面战争 知乎 编辑:程序博客网 时间:2024/04/28 13:04
import java.io.IOException;import java.util.ArrayList;import java.util.List;import org.junit.Test;public class MaxSumOfSubArray { @Test public void test() throws IOException{ //int a[] = {13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7}; String s = MyFileUtil.read("src/test/java/lily/utils/arrays.txt"); System.out.println(s); String[] ss = s.split(","); System.out.println(ss.length); List<Integer> list = new ArrayList<Integer>(); for(int i=0;i<ss.length;i++){ list.add(Integer.parseInt(ss[i])); } //List<Integer> list = Arrays.asList(13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7); SubArray max = divideConqueMethod(list); System.out.println(list.subList(max.maxLeft, max.maxRight+1)); System.out.println(max.maxSum); max = linearMethod(list); System.out.println(list.subList(max.maxLeft, max.maxRight+1)); System.out.println(max.maxSum); } /** * 分治法 * @param list * @return */ public SubArray divideConqueMethod(List<Integer> list){ if(list==null || list.size()==0){ return null; } return divideConqueMethod(list,0,list.size()-1); } public SubArray divideConqueMethod(List<Integer> list,int left, int right){ if(left==right){ return new SubArray(left,left,list.get(left)); }else{ int mid = (left+right)/2; SubArray leftMaxArray = divideConqueMethod(list, left, mid); SubArray rightMaxArray = divideConqueMethod(list, mid+1, right); SubArray midMaxArray = getMaxArray(list,left,mid,right); if(leftMaxArray.maxSum>=rightMaxArray.maxSum && leftMaxArray.maxSum>=midMaxArray.maxSum){ return leftMaxArray; } if(rightMaxArray.maxSum>=leftMaxArray.maxSum && rightMaxArray.maxSum>=midMaxArray.maxSum){ return rightMaxArray; } return midMaxArray; } } private SubArray getMaxArray(List<Integer> list, int left, int mid, int right) { int leftMax=Integer.MIN_VALUE,rightMax=Integer.MIN_VALUE; int leftMaxPosition=mid,rightMaxPosition=mid; int leftSum=0,rightSum=0; for(int i=mid; i>=left;i--){ leftSum += list.get(i); if(leftSum>leftMax){ leftMaxPosition=i; leftMax =leftSum; } } for(int j=mid+1;j<=right;j++){ rightSum += list.get(j); if(rightSum>rightMax){ rightMaxPosition=j; rightMax=rightSum; } } return new SubArray(leftMaxPosition, rightMaxPosition, rightMax+leftMax); } class SubArray{ public int maxLeft; public int maxRight; public int maxSum; public SubArray(int maxLeft, int maxRight, int maxSum){ this.maxLeft = maxLeft; this.maxRight = maxRight; this.maxSum = maxSum; } } /** * 线性算法 */ public SubArray linearMethod(List<Integer> list){ int maxLeft=0,maxRight=0; int maxSum=list.get(0); for(int i=1;i<list.size();i++){ int tempMaxLeft=i; int tempMaxSum=Integer.MIN_VALUE; int tempSum=0; for(int j=i;j>=0;j--){ tempSum+=list.get(j); if(tempSum>tempMaxSum){ tempMaxSum=tempSum; tempMaxLeft=j; } } if(tempMaxSum>maxSum){ maxSum=tempMaxSum; maxLeft=tempMaxLeft; maxRight=i; } } return new SubArray(maxLeft, maxRight, maxSum); } }
可稍加修改,使用https://leetcode.com/problems/maximum-subarray/进行验证
使用分治法时,通过;使用线性方法时,超时了,证明当list的size较大时,分治法的效率更高
0 0
- 算法导论——最大子数组和
- 算法导论——最大子数组
- 算法导论——最大子数组
- 算法导论—最大子数组问题
- 算法导论 - 最大和连续子数组
- 《算法导论》最大子数组和
- 算法导论第四章:最大子数组—递归,暴力和线性算法
- 算法导论——最大子数组问题
- 算法导论例程——最大子数组问题
- 算法导论—最大子数组C/C++实现
- 算法导论第三版4.1最大和子数组思考
- 算法导论 分治1 最大子数组和
- [算法导论]分治法---最大子数组
- 算法导论之最大子数组问题
- 算法导论寻找最大子数组
- 算法导论2-最大子数组
- 算法导论,分治策略,最大子数组
- 【算法导论】最大子数组问题
- MWPhotoBrowser框架的使用步骤
- C#委托 、事件
- jquery checkbox 全选 全不选 反选
- window安装mysql5.7.11
- C#动态编译代码并执行
- 算法导论——最大子数组和
- 隐式意图
- servlet异常处理
- 虚拟机怎样进入Bios
- PHP empty、isset、isnull的区别
- unity选择关卡的跑马灯效果
- Spring线程池的使用demo
- NAT的四种类型及类型检测
- MySQL菜鸟教程