美文网首页动态规划
算法@LeetCode:MaximumSubarray

算法@LeetCode:MaximumSubarray

作者: 苏尚君 | 来源:发表于2017-04-19 20:51 被阅读34次

Log

  • 【170419】完成 01 版(Python)提交(正确提交)与笔记

题目

Maximum Subarray

【题目类型备注】

数组, 动态规划, 分治法

提交

01

【语言】

Python

【时间】

170419

【思路】

(是按照「动态规划」的分类来查找题目的,因此直接思考如何用 DP 的思路来解题)

这种看似贪心、细想可用 O(n^2) 时间复杂度暴力搜索完、但实际上求有增有减的子序列和的问题是典型的动态规划(DP, Dynamic Programming)问题。显然理想情况下若 DP 算法设计正确,只要 O(n) 的时间复杂度即可求得解。

为了实现 DP,需要记录每一步的状态,以便 n 规模的问题可以化为 n-1 规模的问题,即

已知 n-1 规模的最大子序列和,如何变成 n 规模的最大子序列和问题?

那么无非 2 种情况:

  1. subsum[n] = subsum[n-1] + nums[i]:显然,若 subsum[n-1] > 0,是这种情况,因为这样的和会让 subsum[n] 更大(比起不用 subsum[n-1] 来说)
  2. subsum[n] = 0 + nums[i]:若 subsum[n-1] < 0,那么与其用 subsum[n-1],不如直接用 nums[i](由于 subsum[n-1] < 0,所以有 subsum[n-1] + nums[i] < 0 + nums[i]

那么就很容易写出代码了。

【代码】

class Solution(object):
    def maxSubArray(self, nums):
          """
          :type nums: List[int]
          :rtype: int
          """
          resultNow = nums[0]
          submax = [nums[0]]

          for i in range(1, len(nums)):
            if submax[i-1] > 0:
              submax.append(submax[i-1] + nums[i])
            else:
              submax.append(0 + nums[i])
            resultNow = max(submax[i], resultNow)

          return resultNow

【结果】

运行时:69 ms

报告链接:https://leetcode.com/submissions/detail/100564851/

不知道其他拥有 LeetCode 帐号的人能不能看到该报告,所以顺便附图如下:

Your runtime beats 30.23% of python submissions.

P.S. 其实我昨天最开始的思路已经非常接近这个答案了,但没有抓住最开始正确的直觉,而且对于「n 规模的问题与 n-1 规模的问题之间的关系」没足够明确,还多考虑了一种「subsum_max 不在 n-1 上,而是在 n-k 上,与 n 之间还隔着一些数,不确定要不要加上这些数」的情况……总之,对于动态规划问题,关键还是抓住 n 规模问题与 n-1 规模问题之间的联系,写出状态方程。

00

参考解法:

  • Java
    • Java(this problem was discussed by Jon Bentley (Sep. 1984 Vol. 27 No. 9 Communications of the ACM P885))

自己实现一遍最优解:

相关文章

  • 算法@LeetCode:MaximumSubarray

    Log 【170419】完成 01 版(Python)提交(正确提交)与笔记 题目 Maximum Subarra...

  • Swap Nodes in Pairs

    标签: C++ 算法 LeetCode 链表 每日算法——leetcode系列 问题 Swap Nodes in ...

  • Combination Sum II

    标签: C++ 算法 LeetCode DFS 每日算法——leetcode系列 问题 Combinatio...

  • Divide Two Integers

    标签: C++ 算法 LeetCode 每日算法——leetcode系列 问题 Divide Two Integ...

  • First Missing Positive

    标签: C++ 算法 LeetCode 数组 每日算法——leetcode系列 问题 First Missing...

  • Valid Sudoku

    Valid Sudoku 标签: C++ 算法 LeetCode 每日算法——leetcode系列 问题 Val...

  • Next Permutation

    标签: C++ 算法 LeetCode 数组 每日算法——leetcode系列 问题 Next Permuta...

  • Trapping Rain Water

    标签: C++ 算法 LeetCode 数组 每日算法——leetcode系列 问题 Trapping Rain...

  • Combination Sum

    标签: C++ 算法 LeetCode 数组 DFS 每日算法——leetcode系列 问题 Combinat...

  • Remove Nth Node From End of List

    标签: C++ 算法 LeetCode 链表 每日算法——leetcode系列 问题 Remove Nth Nod...

网友评论

    本文标题:算法@LeetCode:MaximumSubarray

    本文链接:https://www.haomeiwen.com/subject/ftwhzttx.html