分治法Q1——最大子序列和

问题描述(最大区段问题)给定一个长度为n的整数序列,求它的最大连续子序列和-2,1,-3,4,-1,2,1,-5,4 最大连续子序列和为4+(-1)+2+1=6注意题目说最大没有说最长
package 分治法;public class 最大连续子序列 {/**解法一:暴力枚举法* 时间复杂度 O(n^3)* 空间复杂度 O(1)* @param nums* @return 返回子区段最大值*/public int maxSubArray(int[] nums) {int max=Integer.MIN_VALUE;//前两个for 切片 切出[begin,end]区间的子序列for(int begin=0;begin<nums.length;begin++) {for(int end=begin;end<nums.length;end++) {//将该区段和统计起来 int sum=0;for(int i=begin;i<=end;i++) {sum+=nums[i];}//比较得出最大区段和max=Math.max(max, sum);}}return max;}/**解法二:带点优化的暴力枚举法* 发现上面穷举时出现大量重复计算* 如-2 1 -3 4 -1 2 1 -5 4* 计算-2到2 之后计算-2到1 又重复计算了-2到d第二个2 这一段 * 可以将这一段结果保存利用下来从而减低复杂度* 时间复杂度 O(n^2)* 空间复杂度 O(1)* @param nums* @return 返回子区段最大值*/public int maxSubArray1(int[] nums) {int max=Integer.MIN_VALUE;//前两个for 切片 切出[begin,end]区间的子序列for(int begin=0;begin<nums.length;begin++) {int sum=0;for(int end=begin;end<nums.length;end++) {sum+=nums[end];//比较得出最大区段和max=Math.max(max, sum);}}return max;}public int maxSubArray2(int[] nums) {//判掉不合理情况if(nums.length<1||nums==null) return 0;return maxSubArray2(nums,0,nums.length);}/**maxSubArray2(int[] nums, int begin, int end)* 功能是求出[begin,end)的最大子序列和*分治法将[begin,end) 分为[begin,mid) [mid,end)*最大子序列区段为[i,j]* */public int maxSubArray2(int[] nums, int begin, int end) {if(end-begin<2) {//递归出口 当区段被切割到只有一个元素时 那么此时最大子序就是它本身return nums[begin];//[begin,end)左闭右开 不能填nums[ends]}int mid=(begin+end)>>1;//第一种情况[i,j)在左半段//左半部分从mid-1开始从右往左扫int leftSum=0;int leftMax=Integer.MIN_VALUE;for(int i=mid-1;i>=begin;i--) {leftSum+=nums[i];leftMax=Math.max(leftMax, leftSum);}//第二种情况[i,j)在右半段//右半部分从mid开始从左往右扫int rightSum=0;int rightMax=Integer.MIN_VALUE;for(int i=mid;i<end;i++) {rightSum+=nums[i];rightMax=Math.max(rightMax, rightSum);}//第三种情况[i,j)左半段和右半段都有int max=leftMax+rightMax;System.out.println(leftMax+" " +max+" "+rightMax);return Math.max(max,Math.max(maxSubArray2(nums,begin,mid),maxSubArray2(nums,  mid,end)));}public static void main(String[] args) {最大连续子序列 a=new 最大连续子序列();int []nums=new int[]{-2,1,-3,4,-1,2,1,-5,4};//int []nums=new int[]{3,1,-1,4,6,-8,9,-5,4};System.out.println(a.maxSubArray(nums));System.out.println(a.maxSubArray1(nums));System.out.println(a.maxSubArray2(nums));}}

分治法解最大子序列和过程
动态规划解法解最大子序列和先留个坑在这里

分治法之图解最大子序列和相关推荐

  1. 求解最大连续子序列和问题(Java)蛮力法+分治法

    求解最大连续子序列和问题 [问题描述] 给定一个有n(n>=1)个整数的序列,要求求出其中最大连续子序列的和. [样例输入] 6 -2 11 -4 13 -5 -2 [样例输出] 20 [问题求 ...

  2. 《github一天一道算法题》:分治法求数组最大连续子序列和

    看书.思考.写代码. /**************************************** copyright@hustyangju * blog: http://blog.csdn.n ...

  3. 四种解法——求子序列的最大连续子序和(普通解法、求和解法、分治法、O(n)级解法)(面试经典题)

    励志用少的代码做高效表达 在这四种解法里,解法一是通法,可以学到规律和知识,做基础之用:解法二在解法一的基础上做改进,锻炼思维:解法三则是大名鼎鼎的分治法,涉及到递归的知识,算是"高效算法设 ...

  4. 求序列中最大子序列和---分治法

    文章预览 1.分治算法基本思想 2.题目 3.调用测试 1.分治算法基本思想 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同.求出子问题的解, ...

  5. 代码分析+原理图解——棋盘覆盖问题-分治法

    上算法课时,老师以文字+代码的方式讲了这道题,然而有很多同学反映听的不是太懂, 我们接触事物最直观的就是以图片理解,因此我尝试使用图解法来帮助大家理解. 问题描述:   注意:分治法最核心的一点是:分 ...

  6. JAVA实现分治法的合并排序及解析

    合并排序的思路 本文将讨论用分治法来实现的合并排序.将问题拆分成几个规模较小但类似于原问题的子问题,再递归去求解这些子问题,最后再合并这些子问题的解来建立原问题的解. 每层递归时都有三个步骤: 分解: ...

  7. 三大算法之一:分治法(带你用分治法思想优化程序,计算降低复杂算法的时间复杂度)

    目录 ​ 零.前言 1.分治法 1.含义 2.分治法主要思想 3.分治法的求解步骤 1.确定初始条件 2.计算每一部分的时间复杂度 3.合并时间复杂度 4.求解 3.最大最小值问题 1.问题描述 2. ...

  8. 动态规划和分治法,贪心算法以及递归的再一次深刻理解和体会

    每次体会算法都有新的感觉,刷题越多,对算法的理解感觉也就越深刻. 下面我们来重新体会下分治法,动态规划,贪心法,递归的理解. 1.分治法: 将问题分成单独的阶段,每个阶段互相不干扰很独立,如10米长的 ...

  9. 从合并排序算法看“分治法”

    本文内容 分治策略 分治步骤 从合并排序看"分治策略" 分治策略 分治法(divide-and-conquer),"分治法策略"是一种很重要的算法.顾名思义,& ...

最新文章

  1. 实现一个简单的编译器
  2. 一家两位Fellow大满贯!北大谢涛当选ACM Fellow,与胞兄谢源完成会师
  3. bzoj1874: [BeiJing2009 WinterCamp]取石子游戏
  4. crt脚本 js 在_crt脚本 js 在_使用SecureCRT自带的脚本录制功能。
  5. python二级简书_12月4日,总结发现杯,备战python二级
  6. mfc 禁用子菜单_MFC界面开发难上手?BCGControlBar v30.3帮你忙—工具栏和菜单
  7. 腾讯AI让二子,柯洁还是输了
  8. oracle11g64位精简版客户端,oracle11g 64位|oracle11g 64位客户端下载 附安装教程 - 121下载站...
  9. MySQL集群---①浅谈MySQL集群原理
  10. 人脸识别门禁系统有哪些功能作用
  11. 当今主流浏览器内核简介
  12. 控制台版单机双人五子棋游戏(Java版)---新人小白
  13. Express + JWT用户认证最轻实践
  14. 怎么去掉WIN7窗口文本框中淡绿色的底色
  15. 一起作业网 肖盾:如何打动投资人,说服老师,造福学生
  16. 使用python封装了一个获取小程序token,发送订阅消息的类
  17. Adobe Flash Player 官方离线最新版下载地址
  18. 数据驱动的网络入侵检测:最新动向与研究趋势
  19. 视频教程-PHP快速入门视频课程(通俗易懂)【2019版】-PHP
  20. win10配置 异地连接 遇到809错误提示

热门文章

  1. windows本地安装K8S
  2. 用PWM实现DAC功能
  3. 使用scrapy爬虫框架来获取腾讯的招聘信息
  4. 家长接到声称自己孩子出车祸需要汇款的电话后,首先要做的是()。
  5. css什么是hack,CSS中hack是什么意思
  6. 联想贺志强:智能互联网时代将有N倍速的产业新机遇
  7. C语言元祖图片,C类(元祖)蛋糕.doc
  8. 东南大学计算机类专业排名,东南大学优势专业排名,2021年东南大学最好的专业排名...
  9. FLUENT UDF编译及蒸发冷凝相关问题
  10. MATLAB里面size什么意思,matlab中的makersize是什么意思