最大乘积区间问题| 豆包MarsCode AI 刷题

52 阅读2分钟

问题描述

小R手上有一个长度为 n 的数组 (n > 0),数组中的元素分别来自集合 [0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]。小R想从这个数组中选取一段连续的区间,得到可能的最大乘积。

你需要帮助小R找到最大乘积的区间,并输出这个区间的起始位置 x 和结束位置 y (x ≤ y)。如果存在多个区间乘积相同的情况,优先选择 x 更小的区间;如果 x 相同,选择 y 更小的区间。

注意:数组的起始位置为 1,结束位置为 n

算法步骤

函数solution:

  1. 初始化变量

    • max_product 用于记录当前找到的最大乘积,初始值设为负无穷大。这样可以确保在后续的比较中,任何实际的乘积都能比它大(最初假设还没有找到任何有效的最大乘积情况)。
    • max_start 和 max_end 两个变量用于记录最大乘积区间的起始和结束位置,初始值设为0。
  2. 双层循环遍历

    • 使用两个嵌套的循环,外层循环遍历区间每个可能的起始位置 i,内层循环遍历区间的结束位置 j,内层循环从起始位置开始,一直到数组末尾,用于遍历以 i 为起始位置的所有可能的连续子区间。
    • 对于每个区间 [i, j],计算连续子区间内所有元素 current_product
  3. 计算区间乘积并更新最大乘积及对应区间

    • 如果 current_product 大于 max_product,如果当前计算得到的子区间乘积大于之前记录的最大乘积,那么更新 max_product 和区间 [max_start, max_end]
    • 如果 current_product 等于 max_product,比较当前区间的起始位置 i 和结束位置 j,选择更小的区间。
  4. 返回结果

    • 最终返回 [max_start, max_end]

测试样例

样例1:

输入:n = 5, arr = [1, 2, 4, 0, 8]
输出:[1, 3]

样例2:

输入:n = 7, arr = [1, 2, 4, 8, 0, 256, 0]
输出:[6, 6]

样例3:

输入:n = 8, arr = [1, 2, 4, 8, 0, 256, 512, 0]
输出:[6, 7]

代码人生

def solution(n, data):
    max_product = float('-inf')
    max_start = 0
    max_end = 0

    for i in range(n):
        current_product = 1
        for j in range(i, n):
            # 计算当前区间的乘积
            current_product *= data[j]
            
            # 如果当前乘积大于最大乘积,更新最大乘积和区间
            if current_product > max_product:
                max_product = current_product
                max_start = i + 1
                max_end = j + 1
            # 如果当前乘积等于最大乘积,比较并更新区间
            elif current_product == max_product:
                if i + 1 < max_start or (i + 1 == max_start and j + 1 < max_end):
                    max_start = i + 1
                    max_end = j + 1

    return [max_start, max_end]

if __name__ == "__main__":
    
    print(solution(5, [1, 2, 4, 0, 8]) == [1, 3])
    print(solution(7, [1, 2, 4, 8, 0, 256, 0]) == [6, 6])