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])