AI刷题:437 数组操作次数计算

70 阅读2分钟

image.png

正常思路(模拟+循环遍历)(运行资源限制,不可取)

问题是:运行资源限制,时间空间复杂度都很大

mod = 10 ** 9 + 7
num = 0
while a:
    if a[0] == 0:
        a.pop(0)
        num += 1
    else:
        a[0] -= 1
        for _ in range(a[0]):
            a.append(a[0]-1)
        num += 1
    return num % mod

直接求值(遍历+递归)

核心:每一个数字都是可以求出来需要多少次运算完成当前元素与添补元素的pop

构造一个计算当前元素的操作次数函数:
For example: 一个元素的list=[4], 它的first_value = 4

First: 4 自己元素本身需要 (4 + 1) 次操作,完成从4 -> 3 -> 2 -> 1 -> 0 -> ''
Second: [] 需要添加为[0, 1, 1, 2, 2, 2, 3, 3, 3]
||
V
First: 完成从4 -> 0 -> '' and 删除 Second中的[0] ;
元素4本身需要 (4 + 1)+ 1 次操作,
Second: 然后完成新列表[1, 1, 2, 2, 2, 3, 3, 3]的递归求值计算
||
V
Second: 完成循环递归计算当前数值的 操作次数:(代码如下)

def calculate_value(value: int) -> int:
    if value == 0:
        return 1
    total = value + 2
    for i in range(1, value):
        total += (i + 1) * calculate_value(i)
    return total

然后完成当前队列的计算就可以了:

def solution(n: int, a: list) -> int:
    mod = 10 ** 9 + 7
    num = 0
    a = deque(a)  # 使用deque优化插入和删除操作

    while a:
        value = a.popleft()
        num += calculate_value(value)

    return num % mod

完整代码如下:

from collections import deque

def calculate_value(value: int) -> int:
    if value == 0:
        return 1
    total = value + 2
    for i in range(1, value):
        total += (i + 1) * calculate_value(i)
    return total


def solution(n: int, a: list) -> int:
    mod = 10 ** 9 + 7
    num = 0
    a = deque(a)  # 使用deque优化插入和删除操作

    while a:
        value = a.popleft()
        num += calculate_value(value)

    return num % mod


if __name__ == '__main__':
    print(solution(n=3, a=[2, 3, 4]) == 257)
    print(solution(n=5, a=[1, 1, 1, 1, 1]) == 15)
    print(solution(n=4, a=[10, 5, 3, 7]) == 68658871)