Skip to content

53. Maximum Subarray #63

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
tech-cow opened this issue Aug 7, 2019 · 0 comments
Closed

53. Maximum Subarray #63

tech-cow opened this issue Aug 7, 2019 · 0 comments

Comments

@tech-cow
Copy link
Owner

tech-cow commented Aug 7, 2019

第一刷

练习DFS写法,没用DP
思路没问题,代码有BUG

错误代码

class Solution(object):
    def maxSubArray(self, nums):
        left, right = 0, len(nums) - 1
        return self.dfsHelper(self, nums, left, right)   # bug 1: self??????
    
    
    def dfsHelper(self, nums, left, right):
        # Base
        if left == right:
            return nums[left] #or right doesn't matter
        
        mid = (l + r) // 2    # bug 2: l + r???????? left + right....
         
        # Request
        leftSum = self.dfsHelper(nums, left, mid)
        rightSum = self.dfsHelper(nums, mid + 1, right)
        midSum = self.getMidSum(nums, left, mid , right)
        
        if leftSum >= rightSum and leftSum >= midSum:
            return leftSum
        
        if rightSum >= leftSum and rightSum >= midSum:
            return rightSum
        
        return midSum
        
        
        
    def getMidSum(self, nums, left, mid, right):
        leftSum, rightSum = -float('inf'), -float('inf')
        
        # Code
        tempSum = 0
        for i in range(mid + 1, left, -1):    # bug 3: should be the other way around
            tempSum += nums[i]  
            leftSum = max(leftSum, tempSum)
            
        tempSum = 0
        for j in range(mid + 1, right + 1):       
            tempSum += nums[j]
            rightSum = max(rightSum, tempSum)
        
        
        return leftSum + rightSum

正确代码

class Solution(object):
    def maxSubArray(self, nums):
        left, right = 0, len(nums) - 1
        return self.dfsHelper(nums, left, right)
    
    
    def dfsHelper(self, nums, left, right):
        # Base
        if left == right:
            return nums[left] #or right doesn't matter
        
        mid = (left + right) // 2
        
        # Request
        leftSum = self.dfsHelper(nums, left, mid)
        rightSum = self.dfsHelper(nums, mid + 1, right)
        midSum = self.getMidSum(nums, left, mid , right)
        
        if leftSum >= rightSum and leftSum >= midSum:
            return leftSum
        
        if rightSum >= leftSum and rightSum >= midSum:
            return rightSum
        
        return midSum
        
        
        
    def getMidSum(self, nums, left, mid, right):
        leftSum, rightSum = -float('inf'), -float('inf')
        
        # Code
        tempSum = 0
        for i in range(mid, left - 1, -1):
            tempSum += nums[i]
            leftSum = max(leftSum, tempSum)
            
        tempSum = 0
        for j in range(mid + 1, right + 1):
            tempSum += nums[j]
            rightSum = max(rightSum, tempSum)
        
        return leftSum + rightSum
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant