题目要求

Find the contiguous subarray within an array (containing at least one number) which has the largest sum.For example, given the array [-2,1,-3,4,-1,2,1,-5,4],
the contiguous subarray [4,-1,2,1] has the largest sum = 6.

即:寻找数列中的一个子数列,该数列中的值得和是所有子数列中最大的。

思路一:divide&conquer

我们可以从数列的中间节点将数列分为两个子数列,则最大的子数列要么在左子列,要么在右子列,要么跨越了左子列和右子列。我们可以分别得出这三种情况下的最大子数列和,并比较得出最大的那个。
divide&conquer即递归思路,将复杂问题分解为简单的小问题分别解决。递归的重点在于覆盖所有可能情况,并且覆盖到基类。

    public int maxSubArray(int[] nums) {int start = 0;int end = nums.length - 1;return maxSubArray(nums, start, end);}//递归调用该方法public int maxSubArray(int[] nums, int start, int end){if(start==end){return nums[start];}int mid = (start + end) / 2;//获得最大左子列int leftMax = maxSubArray(nums, start, mid);//获得最大右子列int rightMax = maxSubArray(nums, mid+1, end);//获得最大中子列int leftSumMax = Integer.MIN_VALUE;int temp = 0;do{temp += nums[mid];if(temp>leftSumMax){leftSumMax = temp;}}while((--mid)>=start);temp = 0;mid = (start + end)/2 + 1;int rightSumMax = Integer.MIN_VALUE;do{temp += nums[mid];if(temp>rightSumMax){rightSumMax = temp;}}while((++mid)<=end);int midMax = leftSumMax + rightSumMax;return Math.max(Math.max(leftMax, rightMax), midMax);}

思路二:divide&conquer2 recursion

上面是将数组从中划分为两个子数组,这里我们还可以划分为nums[n-1]和nums[n]。这样我们就可以将右子列的情况简化为直接返回右子列的值。我们只需要考虑左子列的最大和以及跨越了左右的中子列的最大值。所以我们需要记录两个值,第一个是当前最大和,还有一个是到nums[n-1]的最大子列和。

    public int maxSubArray(int[] A) {int n = A.length;//存储经过下标为i的最大子数列和,用于判断中子列int[] dp = new int[n];dp[0] = A[0];int max = dp[0];for(int i = 1; i < n; i++){dp[i] = A[i] + (dp[i - 1] > 0 ? dp[i - 1] : 0);max = Math.max(max, dp[i]);}return max;    }


想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注我的微信公众号!将会不定期的发放福利哦~

leetcode53 Maximum Subarray 最大连续子数组相关推荐

  1. LeetCode 581. 最短无序连续子数组(Shortest Unsorted Continuous Subarray)

    581. 最短无序连续子数组 581. Shortest Unsorted Continuous Subarray 题目描述 给定一个整型数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序 ...

  2. python求最大连续子数组

    寻找最大子数组问题: 给定数组A:寻找A中的和最大的非空连续子数组.我们称这样的连续子数组为最大子数组(maximum subarray) 1.暴力求解:两个循环,时间复杂度为O(n^2) 2.用分治 ...

  3. 581. 最短无序连续子数组

    给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序. 请你找出符合题意的 最短 子数组,并输出它的长度. 示例 1: 输入:nums ...

  4. 数组中最大连续子数组和,最大连续子数组积,最大递增子序列

    最大连续子数组和: 递推式:curmax=max(a[i],curmax)    其中curmax是以i为结尾(意思必须取到a[i])和的最大值,其中每次循环比较curmax和已经保存最大值 最大连续 ...

  5. sscanf 连续相同编辑符_基于单调栈的滑动窗口法求解“和至少为 K 的最短连续子数组”...

    题目解读 题目要求我们给出一个最短的连续子数组,且这个子数组的和要大于等于 K.乍一看,除了暴力,似乎没什么思路.由于数组规模为 50000,暴力肯定会超时的.但是,我们还是要先暴力一把,看看有什么灵 ...

  6. 查找数组连成环形的和最大的连续子数组

    思路: 把每一种起点情况下的最大子数组之和S求出,存入S[]数组中,最后比较S[]中的最大值(i为数组的长度)存为MaxSum.而此时的起点-finalStart和终点-finalEnd也同样可以在求 ...

  7. 【LeetCode】【HOT】581. 最短无序连续子数组

    [LeetCode][HOT]581. 最短无序连续子数组 文章目录 [LeetCode][HOT]581. 最短无序连续子数组 package hot;public class Solution58 ...

  8. Leetcode 581.最短无序连续子数组

    最短无序连续子数组 给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序. 你找到的子数组应是最短的,请输出它的长度. 示例 1: 输入: [2, ...

  9. 算法学习-零子数组,最大连续子数组

    题目 对于长度为N的数组A,求连续子数组的和最接近0的值. 如: 数组A:1,-2,3,10,-4,7,2,-5 它是所有子数组中,和最接近0的是哪个? 算法流程 申请比A长1的空间sum[-1,0, ...

最新文章

  1. 一文讲解特征工程 | 经典外文PPT及中文解析
  2. 城市仿真为何成为大势所趋?
  3. nrf51822蓝牙学习笔记之实例分析PPI和SHORT
  4. Active Diretory 全攻略(五)--规划和建立组
  5. Python 基础教程:切片、迭代和列表生成式
  6. undolog 是binlog_msyql日志-binlog-undolog-redolog
  7. 解决Entry fileTemplates//Singleton.java.ft not found in C:/Dev/android-studio/lib/resources_en.jar
  8. cc如何转换html5,HTML5转换
  9. maven 不能使用 snapshot 的解决方式
  10. 高效配置Linux代理服务器――Squid
  11. Linux 下的这些高效指令,是你快速入门运维的神器
  12. 3dmax uv展开
  13. bluefish编辑器的配置
  14. 剧本供不应求,会写课堂助力创作者入局剧本杀
  15. JavaSE详细总结——万字纯手码
  16. 面试关于网络的那些事
  17. UI组件库Form表单_数字类型验证之坑实现数字框
  18. nmap -oG -iL 写入文件和读取文件之[网鼎杯 2020 朱雀组]Nmap
  19. Mac 文件直接被永久删除,而不进垃圾箱 的 解决办法
  20. VB(视频缓冲区)配置

热门文章

  1. Android中利用productFlavors配置多渠道
  2. nginx实现301(加密)跳转和200跳转
  3. 一个小栗子聊聊JAVA泛型基础
  4. SHA-1算法c语言实现
  5. C# TreeView 连续点击 不触发AfterCheck事件
  6. 解决《Mobile绘制背景图片》中的问题
  7. 镜像服务器文件实时监控同步程序
  8. mysql 触发器 定时触发_mysql 触发器和存储过程组合使用,实现定时触发操作
  9. python 写入excel 日期_Python实例:excel文档写入操作
  10. c语言中error c2601,C 语言   dd.cpp(46) : error C2601: 'main' : local function definitions are illegal...