Python-92:最大乘积区间问题

问题描述

小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

代码

from math import log

def solution(n: int, arr: list[int]) -> list[int]:

    # Edit your code here

    """

    寻找最大乘积区间

    Args:

        n: 数组长度

        arr: 输入数组

    Returns:

        返回最大乘积区间的起始和结束位置 [x, y]

    """

    # 结果数组,保存起始位置x和结束位置y

    result = [1, 1]

    # 初始化最大对数和

    max_log_sum = float('-inf') if arr[0] == 0 else log(arr[0])

   

    # 遍历所有可能的起始位置

    for i in range(n):

        # 如果起始位置是0,单独处理

        if arr[i] == 0:

            if max_log_sum == float('-inf') and (result[0] > i + 1):

                result[0] = i + 1

                result[1] = i + 1

            continue

           

        # 当前区间的对数和

        current_log_sum = 0

        # 遍历从i开始的所有可能的结束位置

        for j in range(i, n):

            # 如果当前数是0,结束当前内层循环

            if arr[j] == 0:

                break

           

            # 累加对数

            current_log_sum += log(arr[j])

           

            # 更新最大值和对应的区间

            if (current_log_sum > max_log_sum or

                (abs(current_log_sum - max_log_sum) < 1e-10 and i + 1 < result[0]) or

                (abs(current_log_sum - max_log_sum) < 1e-10 and i + 1 == result[0] and j + 1 < result[1])):

                max_log_sum = current_log_sum

                result[0] = i + 1

                result[1] = j + 1

   

    return result


 

if __name__ == "__main__":

    # Add your test cases here

    print(solution(5, [1, 2, 4, 0, 8]) == [1, 3])

    print(solution(7, [1, 2, 4, 8, 0, 256, 0]) == [6, 6])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

完成大叔

你的鼓励是创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值