zoukankan      html  css  js  c++  java
  • 45. 最大子数组差

    45. 最大子数组差

    中文English

    给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大。

    返回这个最大的差值。

    样例

    例1:

    输入:[1, 2, -3, 1]
    输出:6
    解释:
    子数组是 [1,2] 和[-3].所以答案是 6.
    

    例2:

    输入:[0,-1]
    输出:1
    解释:
    子数组是 [0] 和 [-1].所以答案是 1.
    

    挑战

    时间复杂度为O(n),空间复杂度为O(n)

    注意事项

    子数组最少包含一个数

    贪心解法 + 维护四个列表(左大右小, 右大左小)

    class Solution:
        """
        @param nums: A list of integers
        @return: An integer indicate the value of maximum difference between two substrings
        """
        def maxDiffSubArrays(self, nums):
            # 边界检测
            if len(nums) < 2:
                return 0
    
            # 变量定义
            length = len(nums)
            max_sum_array_left, max_sum_array_right = [0]*length, [0]*length
            min_sum_array_left, min_sum_array_right = [0]*length, [0]*length
            
            # 贪心计算
            for i in range(length):
                if i == 0: 
                    max_sum_array_left[0] = nums[0]
                    min_sum_array_left[0] = nums[0]
                else:
                    max_sum_array_left[i] = max(nums[i], nums[i] + max_sum_array_left[i - 1])
                    min_sum_array_left[i] = min(nums[i], nums[i] + min_sum_array_left[i - 1])
    
            
            for i in range(length - 1, -1, -1):
                if  i == length - 1: 
                    max_sum_array_right[length - 1]: max_sum_array_right[length - 1] = nums[length - 1]
                    min_sum_array_right[length - 1]: min_sum_array_right[length - 1] = nums[length - 1]
                else:
                    max_sum_array_right[i] = max(nums[i], nums[i] + max_sum_array_right[i + 1])
                    min_sum_array_right[i] = min(nums[i], nums[i] + min_sum_array_right[i + 1])
            
            # 最后计算
            res = -sys.maxsize
            for i in range(length - 1):
                res = max(res, abs(max_sum_array_left[i] - min_sum_array_right[i + 1]), abs(min_sum_array_left[i] - max_sum_array_right[i + 1]))
            
            return res
  • 相关阅读:
    如何在数据库某一列数据的前面或者后面增加字符
    jmeter分布式测试教程和远程的代理机无法连接网络的问题解决方法
    jmeter和jdk的安装教程
    第十周总结
    第九周总结
    第八周总结
    企业应用架构模式-阅读笔记01
    需求征集系统进度08
    需求征集系统进度07
    第七周总结
  • 原文地址:https://www.cnblogs.com/yunxintryyoubest/p/14327501.html
Copyright © 2011-2022 走看看