zoukankan      html  css  js  c++  java
  • 边工作边刷题:70天一遍leetcode: day 28-2

    Maximum Subarray

    • O(n) solution:local解的核心就是判断是否从当前元素重新开始。如果前一个local值<0,那么要从这个元素开始。
    • divide and conquer:两点
      • 包含中间点的最长序列的计算:向左右两方向延伸,不断更新最大值,最差情况是遍历所有元素,O(n)。注意最小值是0,而不是INT_MIN:空序列是0,所以不用担心会有负数结果。如果用INT_MIN,不更新的情况不是得到0
      • recursion:这类递归和merge sort类似结构,值得注意的是边界条件。另外如果递归是(low, m), (m+1, high),那么注意无限循环因为1个或者2个元素m总是在第一个元素不变。递归也可能是(low,m-1),(m+1,high)。所以前者边界里包含low==high,后者边界要包含low>high
    class Solution(object):
        def maxSubArray(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            def maxSubRec(nums, i, j):
                if i>j:
                    return -sys.maxint - 1
                
                m = i+(j-i)/2
                # go left
                k = m-1
                leftsum = 0
                sum = 0
                for k in range(m-1, i-1, -1):
                    sum += nums[k]
                    if leftsum<sum:
                        leftsum=sum
                
                k = m+1
                rightsum = 0
                sum = 0
                for k in range(m+1, j+1):
                    sum += nums[k]
                    if rightsum<sum:
                        rightsum=sum
                return max(leftsum+rightsum+nums[m], maxSubRec(nums, i, m-1), maxSubRec(nums, m+1, j))
            
            return maxSubRec(nums, 0, len(nums)-1)
    
  • 相关阅读:
    遍历卷,遍历磁盘
    宽字符
    GetSystemDirectory
    WIN32_FILE_ATTRIBUTE_DATA structure
    几条shell命令
    log4j学习(二)不同类的日志输出到不同的文件
    Java中的split和join
    如何使用socket进行java网络编程(二)
    如何使用socket进行java网络编程(一)
    log4j学习(一)最简单的例子
  • 原文地址:https://www.cnblogs.com/absolute/p/5678083.html
Copyright © 2011-2022 走看看