4.数字分组求偶数和题解 | 豆包MarsCode AI刷题

127 阅读3分钟

题目简述

1 到 9 的数字被分成多个小组,需要从每个小组中选择一个数字组成一个新的数(这个新数的各位数字之和为偶数),求有多少个选择方案

输入:

  • numbers: 一个由多个整数字符串组成的列表,每个字符串可以视为一个数字组。

输出:

  • 方案数

代码思路

因为在这个情景下,我们需要遍历所有可能的选择情况,并且需要逐步构建数字组合,同时要求各位数字之和为偶数。这种情况下,BFS是一个自然而然的选择,因为它适合用于遍历层级结构,并且可以帮助我们逐层扩展搜索,直到达到目标状态。

具体如下:

初始化变量和队列

  • 首先,定义变量n表示数字组的数量,即numbers列表中整数字符串的个数。

  • 使用双端队列q来存储当前数字组合和所处位置的元素。

  • 将第一个数字组的每个数字加入队列:遍历第一个整数字符串的每个数字,将其转换为整数并加入队列中。每个元素是一个列表,包含两个值:当前数字组合和当前所处的数字组索引。

n = len(numbers)
q = deque()

# 初始化队列,将第一个数字组的每个数字加入队列
for num in str(numbers[0]):
    q.append([int(num), 1])

BFS遍历

  • 从队列中取出一个元素,即当前数字组合和当前所处的数字组索引。

  • 如果当前数字组合所处的数字组索引等于数字组的数量n,则检查当前数字组合是否满足条件(各位数字之和为偶数),如果是则将答案计数ans加1。

  • 如果当前数字组合所处的数字组索引小于数字组的数量n,则将下一个数字组的每个数字与当前数字组合相加,并将新的数字组合和数字组索引加1后加入队列中。

ans = 0
while q:
    now_num, k = q.popleft()
    if k == n:
        if now_num % 2 == 0:
            ans += 1
            continue

            # 将下一个数字组的每个数字加入队列
            for num in str(numbers[k]):
                q.append([now_num+ int(num), k + 1])

返回结果

返回最终的答案ans,表示满足条件的不同分组和选择方法的数量。

复杂度分析

时间复杂度

在最坏情况下,我们需要考虑所有可能的数字组合,即从每个数字组中选择一个数字。因此,总共可能的选择情况为m^n(每个数字组有m种选择,一共n个数字组)。

在每一步中,对于每个当前数字组合,我们需要将下一个数字组的每个数字与当前数字组合相加,这个操作的时间复杂度为O(m)。

因此,总体时间复杂度为O(m^n * m)

空间复杂度

在BFS算法中,我们使用一个双端队列来存储当前数字组合和所处位置的元素。队列中的元素个数不会超过m^n个(每个数字组合有m种选择,一共n个数字组),因此队列的空间复杂度为O(m^n)。

此外,我们还需要一些额外的空间来存储其他变量和最终结果,这部分空间复杂度可以忽略不计。

综合考虑,总体空间复杂度为O(m^n)