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))
posted @ 2021-01-28 15:04  楠海  阅读(57)  评论(0编辑  收藏  举报