• leetcode 152


    在整数的列表中寻找一个乘积最大的子列, 输出该乘积. 子列指连续的一个区间.

    整数有0, 负数和正数. 在非零的情况下, 乘积的绝对值是会随着数组长度的增长而增加的.

    首先找到所有的0, 将数组分割为若干个只包含0长度为1的子列和若干个不包含0的子列.

    现在求解一个不含0的数组的连续乘积最大值, 如果包含的负数为偶数个, 则是所有数的乘积. 如果包含负数为奇数个, 则最后一个负数之前的数的乘积或者是第一个负数之后的数的乘积.

    计算复杂度为O(n), 空间复杂度可以到O(1), 但是我暂时写了一个为O(n)的版本, 也通过了.

    class Solution:
        def maxProductWithoutZero(self, nums: List[int], start_index, end_index) -> int:
            if start_index == end_index:
                return nums[start_index]
            minus_index_list = []
            for i in range(start_index, end_index + 1):
                v = nums[i]
                if v < 0:
                    minus_index_list.append(i)
            if len(minus_index_list) % 2 == 1:
                tmp_1 = 1
                for i in range(minus_index_list[0] + 1, end_index + 1):
                    tmp_1 *= nums[i]
                tmp_2 = 1
                for i in range(start_index, minus_index_list[-1]):
                    tmp_2 *= nums[i]
                return max(tmp_1, tmp_2)
            else:
                result = 1
                for i in range(start_index, end_index + 1):
                    result *= nums[i]
                return result
    
        def maxProduct(self, nums: List[int]) -> int:
            if not nums:
                return None
            zero_index_list = [-1]
            for i, v in enumerate(nums):
                if v == 0:
                    zero_index_list.append(i)
            result = nums[0]
            zero_index_list.append(len(nums))
            for i in range(len(zero_index_list)-1):
                if zero_index_list[i] + 1 <= zero_index_list[i+1] - 1:
                    tmp_result = self.maxProductWithoutZero(nums, zero_index_list[i] + 1, zero_index_list[i+1] - 1)
                    if tmp_result > result:
                        result = tmp_result
            if len(zero_index_list) > 2:
                if 0 > result:
                    result = 0
            return result
    
  • 相关阅读:
    input输入框只能输入数字和 小数点后两位
    HAVING 子句
    GROUP BY 语句
    SUM()函数
    COUNT()函数
    MySQL AVG() 函数
    adb(16)-查看实时资源占用情况top
    adb(15)-刷机相关命令
    adb(14)-设备重启/检测root
    adb(13)-设置系统日期和时间
  • 原文地址:https://www.cnblogs.com/mangmangbiluo/p/15569301.html
Copyright © 2020-2023  润新知