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

40 阅读4分钟

问题描述:小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

思路讲解: 首先定义一个array(9*2)的元组用于储存首尾顺序信息,再用一个max_result的元组来储存最大值的信息,遍历数组arr,如果遇到0则跳过然后重新更新result的值,如果没有则继续执行,并保存首尾的值,最后返回一个最大值对应的首尾序。 完整代码如下:

    # Edit your code here
    max_result = []
    array = [[0 for _ in range(2)] for _ in range(9)]
    result = 1
    i, j = 0, 0
    if n == 1:
        return [1,1]
    while i < n:
        if arr[i] != 0:
            result *= arr[i]
            if array[j][0] == 0:
                array[j][0] = i+1
            elif i == n-1 and arr[i] != 1:
                array[j][1] = i+1
                max_result.append(result)
            elif i == n-1 and arr[i] == 1:
                array[j][1] = i
                max_result.append(result)
            i += 1
        elif arr[i] == 0:
            if arr[i-1] == 1:
                array[j][1] = i-1
            else:
                array[j][1] = i
            i += 1
            j += 1
            max_result.append(result)
            result = 1
    index = max_result.index(max(max_result))
    print(max_result)
    print(array)
    return array[index]


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])
    print(solution(11, [1024,0,2,1,0,2,128,512,4,256,256]) == [6,11])

以下为对代码的解释: def solution(n: int, arr: list[int]) -> list[int]: 定义了一个名为solution的函数,它接受两个参数:n(整数,表示数组的长度)和arr(整数列表)。函数的返回类型是整数列表,这个列表包含两个元素,即乘积最大子数组的起始和结束索引。

max_result = [] 初始化一个空列表max_result,用于存储每次乘积操作的结果。

array = [[0 for _ in range(2)] for _ in range(9)] 初始化一个二维列表array,用于存储每个乘积子数组的起始和结束索引。这里假设最多有9个这样的子数组,每个子数组用两个元素表示。

result = 1 初始化一个变量result,用于存储当前的乘积结果,初始值为1。 i, j = 0, 0 初始化两个索引变量ij,分别用于遍历数组和记录array中的当前子数组。 if n == 1: return [1,1] 如果数组只有一个元素,直接返回[1,1],因为只有一个元素,所以起始和结束索引都是1。

  1. while i < n: 开始一个循环,直到遍历完整个数组。

if arr[i] != 0: 如果当前元素不为0,执行以下操作:

-   `result *= arr[i]` 将当前元素乘以`result`,更新当前的乘积结果。
-   `if array[j][0] == 0:` 如果当前子数组的起始索引未设置,设置为当前索引加1。
-   `elif i == n-1 and arr[i] != 1:` 如果是数组的最后一个元素且不为1,设置当前子数组的结束索引,并添加乘积结果到`max_result`-   `elif i == n-1 and arr[i] == 1:` 如果是数组的最后一个元素且为1,设置当前子数组的结束索引,并添加乘积结果到`max_result`-   `i += 1` 移动到下一个元素。

elif arr[i] == 0: 如果当前元素为0,执行以下操作:

-   `if arr[i-1] == 1:` 如果前一个元素为1,将前一个元素的索引作为结束索引。
-   `else:` 否则,将当前元素的索引作为结束索引。
-   `i += 1` 移动到下一个元素。
-   `j += 1` 移动到`array`中的下一个子数组。
-   `max_result.append(result)` 将当前的乘积结果添加到`max_result`-   `result = 1` 重置`result`为1,为下一个子数组的乘积计算做准备。

index = max_result.index(max(max_result)) 找到max_result中最大值的索引。

print(max_result) 打印所有乘积的结果。

print(array) 打印所有子数组的起始和结束索引。

return array[index] 返回乘积最大的子数组的起始和结束索引。

if __name__ == "__main__": 这是Python中的常规用法,用于判断当前脚本是否作为主程序运行。

print(solution(5, [1, 2, 4, 0, 8]) == [1, 3]) 测试用例,检查函数是否正确返回[1, 3]。

print(solution(7, [1, 2, 4, 8, 0, 256, 0]) == [6, 6]) 另一个测试用例,检查函数是否正确返回[6, 6]。

print(solution(11, [1024,0,2,1,0,2,128,512,4,256,256]) == [6,11]) 第三个测试用例,检查函数是否正确返回[6, 11]。