AlgoMooc
你已开通华为OD训练营权益,还差最后一步——完成入营激活(兑换课程 + 加飞书 + 登记服务群),即可解锁全部课程与专属服务。去激活 →
← 返回题库

K0000. 圈复杂度计算

中等通过率 19% · 提交 528 · 通过 98
DFS回溯图论记忆化搜索

小慕正在参与一个代码复杂度分析项目,他需要计算以下三份代码的。 第1份代码:

def find_paths(maze, x, y, path=None, visited=None):
    if path is None:
        path = []
    if visited is None:
        visited = set()

    rows, cols = len(maze), len(maze[0])

    # 检查是否到达终点
    if x == rows - 1 and y == cols - 1:
        return [path + [(x, y)]]

    # 标记当前点为已访问
    visited.add((x, y))
    path.append((x, y))

    # 定义方向:右、下、左、上
    directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]
    paths = []

    for dx, dy in directions:
        nx, ny = x + dx, y + dy
        if 0 <= nx < rows and 0 <= ny < cols and (nx, ny) not in visited and maze[nx][ny] == 0:
            paths.extend(find_paths(maze, nx, ny, path[:], visited.copy()))

    return paths

第2份代码:

def coin_change(coins, amount):
    # dp[i] 表示组成金额 i 所需的最少硬币数
    dp = [float('inf')] * (amount + 1)
    dp[0] = 0  # 组成金额 0 不需要任何硬币

    for coin in coins:
        for i in range(coin, amount + 1):
            dp[i] = min(dp[i], dp[i - coin] + 1)

    return dp[amount] if dp[amount] != float('inf') else -1

第3份代码:

def validate_and_process_parentheses(s):
    stack = []  # 用于存储索引
    matched = [-1] * len(s)  # 标记每个位置是否匹配

    for i, char in enumerate(s):
        if char == '(':
            stack.append(i)
        elif char == ')' and stack:
            match_index = stack.pop()
            matched[match_index] = i  # 记录匹配的位置
            matched[i] = match_index

    is_balanced = all(matched[i] != -1 for i in range(len(s)) if s[i] in "()")

    # 寻找最长

提示:带虚线的词点一下有通俗解释。

输入描述

输出描述

打印三行整数分别表示它们的圈复杂度,例如: ``` 100 1000 10000 ``` 对于这道题目,如果使用python代码打印那就是: ```py print(100) print(1000) print(10000) ```

时间限制 1000 ms · 内存限制 128 MB

看不懂题目?点开图解
圈复杂度图解 代码1:迷宫寻路 if 到达终点 → 1条路径 for 四个方向 → 4条分支 if 边界/访问/障碍 → 条件 圈复杂度 = 1 + 4 + 1 = 6 (实际递归更复杂) 代码2:硬币找零 for coin in coins → 外层循环 for i in range → 内层循环 dp[i] = min(...) → 条件赋值 圈复杂度 = 1 + 1 + 1 = 3 (循环嵌套算2个分支) 代码3:括号匹配 for i, char in enumerate → 循环 if char == '(' → 条件1 elif char == ')' and stack → 条件2 圈复杂度 = 1 + 1 + 1 = 3 (all() 内部还有条件) 圈复杂度 = 1(基础) + 每个 if/for/while 等分支数
写完代码点「提交」,将对全部测试用例判题。

向老师提问

针对「圈复杂度计算」把疑问、代码和报错填清楚,老师收到后能更快、更准地回复你。