zoukankan      html  css  js  c++  java
  • 161-53. 最大子序和

    
    给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。(一个也不会,难受)
    class Solution(object):
        def maxSubArray1(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            return self.max_sub(0, len(nums) - 1, nums)[-1]
    
        def max_sub(self, start, end, nums):
            if start == end:
                return nums[start], nums[start], nums[start], nums[start]
    
            mid = (start + end) >> 1
            left_left_sum, left_right_sum, left_all_sum, left_mid_sum = self.max_sub(start, mid, nums)
            right_left_sum, right_right_sum, right_all_sum, right_mid_sum = self.max_sub(mid + 1, end, nums)
    
            return max(left_left_sum, left_all_sum + right_left_sum), 
                   max(right_right_sum, right_all_sum + left_right_sum), 
                   left_all_sum + right_all_sum, 
                   max(left_right_sum + right_left_sum, max(left_mid_sum, right_mid_sum))
    
        def maxSubArray2(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            # pre, max_ans = 0, nums[0]
            pre = 0
            max_ans = nums[0]
            for item in nums:
                # pre记录是当前值和前n个连续值的最大值;当前n个连续值,小于当前值时直接将pre指向当前值
                # 也就是前n个连续数不存在最大连续数组,直接抛弃前n项,从n+1项继续记录
                pre = max(pre + item, item)
                # max_ans一直记录的是连续子项的最大值
                max_ans = max(max_ans, pre)
    
            return max_ans
    
        def maxSubArray3(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            return self.get_info(nums, 0, len(nums) - 1).m_sum
    
        def get_info(self, nums, left, right):
            if left == right:
                return Status(nums[left], nums[left], nums[left], nums[left])
    
            mid = (left + right) >> 1
            l_sub = self.get_info(nums, left, mid)
            r_sub = self.get_info(nums, mid+1, right)
            return self.push_up(l_sub, r_sub)
    
        def push_up(self, l, r):
            i_sum = l.i_sum + r.i_sum
            l_sum = max(l.l_sum, l.i_sum + r.l_sum)
            r_sum = max(r.r_sum, r.i_sum + l.r_sum)
            m_sum = max(max(l.m_sum, r.m_sum), l.r_sum + r.l_sum)
            return Status(l_sum, r_sum, m_sum, i_sum)
    
        def maxSubArray4(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
    
            if len(nums) == 0:
                return 0
            if len(nums) == 1:
                return nums[0]
            tmp_list = []
            max_sum = nums[0]
            while nums:
                tmp_list.append(nums.pop(0))
                if sum(tmp_list) > max_sum:
                    max_sum = sum(tmp_list)
                if sum(tmp_list) < 0:
                    tmp_list = []
            return max_sum
    
        def maxSubArray5(self, nums):
            """最原始的dp方式
            :type nums: List[int]
            :rtype: int
            """
            length = len(nums)
            dp = [0 for _ in range(length)]
            dp[0] = nums[0]
            max_value = dp[0]
            for i in range(length):
                dp[i] = max(dp[i-1] + nums[i], nums[i])
                max_value = max(max_value, dp[i])
            return max_value
    
        def maxSubArray(self, nums):
            """暴力递归,算出每个未知的最大值
            :type nums: List[int]
            :rtype: int
            """
            max_value = float("-inf")
            length = len(nums)
            for i in range(length):
                sum_ = 0
                for j in range(i, length):
                    sum_ += nums[j]
                    max_value = max(max_value, sum_)
            return max_value
    
    class Status:
        def __init__(self, l_sum, r_sum, m_sum, i_sum):
            self.l_sum = l_sum
            self.r_sum = r_sum
            self.m_sum = m_sum
            self.i_sum = i_sum
    
    
    if __name__ == '__main__':
        s1 = Solution()
        s = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
        print(s1.maxSubArray1(s))
    
  • 相关阅读:
    转载c++中的多态性
    sdk环境下数据库访问之ADO
    ADO数据库访问问题
    PopMenu 弹出式菜单(变灰,禁用,激活)
    控制台窗口界面控制设计
    判断整数序列是不是二元查找树的后序遍历结果
    把二元查找树转变成排序的双向链表
    二叉树平衡因子应用举例
    二元查找树转换为它的镜像
    满二叉树先序、中序和后序之间的转换
  • 原文地址:https://www.cnblogs.com/liuzhanghao/p/14339884.html
Copyright © 2011-2022 走看看