首页 > 其他 > 详细

161-53. 最大子序和

时间:2021-01-28 17:42:04      阅读:24      评论:0      收藏:0      [点我收藏+]

给定一个整数数组 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


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))

161-53. 最大子序和

原文:https://www.cnblogs.com/liuzhanghao/p/14339884.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!