[每天一道 Leetcode] 53. 最大子序和 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Acceml
V2EX    C

[每天一道 Leetcode] 53. 最大子序和

  •  
  •   Acceml 2018-08-27 23:29:26 +08:00 2670 次点击
    这是一个创建于 2617 天前的主题,其中的信息可能已经有所发展或是发生改变。

    题目

    给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例:

    输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 

    进阶:

    如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。

    题解

    动规的经典题目。遍历数组,累加,当累加的值小于 0 时,从下一元素开始再从新累加。在这个过程中记录下最大累加值就可以了。

    class Solution { public int maxSubArray(int[] nums) { int res = nums[0]; int current = nums[0]; for (int i = 1; i < nums.length; i++) { if (current < 0) { current = nums[i]; } else { current += nums[i]; } res = Math.max(current, res); } return res; } } 

    这个题目还让用分而治之的方法,那怎么分治呢?具有最大和的子序列存在于一下三种情况之中:

    1. 该最大和子序列存在于其上一级子序列的左半部分中

    2. 该最大和子序列存在于其上一级子序列的右半部分中

    3. 该最大和子序列存在于其上一级子序列的中间部分(既从中间点向左右延伸的序列)

    情况 1 和情况 2 可以通过迭代( recursion )解决。

    情况 3 可以通过由中间节点开始,向左计算左半部分的和的最大值,向右计算右半部分的和的最大值,然后叠加得到。这种方法需要 O(n)时间。

    该段代码运行时间符合 T(n) = 2*T(n/2) + O(n)。

    class Solution { public int maxSubArray(int[] nums) { return maxSubArray(nums, 0, nums.length - 1); } public int maxSubArray(int[] nums, int left, int right) { if (left > right) { return Integer.MIN_VALUE; } else if (left == right) { return nums[left]; } else { int middle = (right - left) / 2 + left; int leftMax = maxSubArray(nums, left, middle); int rightMax = maxSubArray(nums, middle + 1, right); int sum = 0; int maxToLeft = Integer.MIN_VALUE; for (int i = middle; i >= left; i--) { sum += nums[i]; maxToLeft = Math.max(maxToLeft, sum); } sum = 0; int maxToRight = Integer.MIN_VALUE; for (int i = middle + 1; i <= right; i++) { sum += nums[i]; maxToRight = Math.max(maxToRight, sum); } int result = maxToLeft + maxToRight; result = Math.max(result, leftMax); result = Math.max(result, rightMax); return result; } } } 

    热门阅读


    最近在刷题,有一起的可以加手撕代码群:805423079 Leetcode 名企之路

    2 条回复    2018-08-28 14:16:51 +08:00
    fuchaofather
        1
    fuchaofather  
       2018-08-28 13:23:51 +08:00
    程序员节不是`10 月 24 号`吗?
    Acceml
        2
    Acceml  
    OP
       2018-08-28 14:16:51 +08:00
    @fuchaofather 回复 1024
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     6171 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 45ms UTC 02:14 PVG 10:14 LAX 19:14 JFK 22:14
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86