问题描述
小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:
-
初始化变量:
max_product用于记录当前找到的最大乘积,初始值设为负无穷大。这样可以确保在后续的比较中,任何实际的乘积都能比它大(最初假设还没有找到任何有效的最大乘积情况)。max_start和max_end两个变量用于记录最大乘积区间的起始和结束位置,初始值设为0。
-
双层循环遍历:
- 使用两个嵌套的循环,外层循环遍历区间每个可能的起始位置
i,内层循环遍历区间的结束位置j,内层循环从起始位置开始,一直到数组末尾,用于遍历以i为起始位置的所有可能的连续子区间。 - 对于每个区间
[i, j],计算连续子区间内所有元素current_product。
- 使用两个嵌套的循环,外层循环遍历区间每个可能的起始位置
-
计算区间乘积并更新最大乘积及对应区间:
- 如果
current_product大于max_product,如果当前计算得到的子区间乘积大于之前记录的最大乘积,那么更新max_product和区间[max_start, max_end]。 - 如果
current_product等于max_product,比较当前区间的起始位置i和结束位置j,选择更小的区间。
- 如果
-
返回结果:
- 最终返回
[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])