解析:小F的矩阵值调整 | 豆包MarsCode AI 刷题

52 阅读5分钟

问题描述

小F得到了一个矩阵。如果矩阵中某一个格子的值是偶数,则该值变为它的三倍;如果是奇数,则保持不变。小F想知道调整后的矩阵是什么样子的。


测试样例

样例1:

输入:a = [[1, 2, 3], [4, 5, 6]]
输出:[[1, 6, 3], [12, 5, 18]]

样例2:

输入:a = [[7, 8, 9], [10, 11, 12]]
输出:[[7, 24, 9], [30, 11, 36]]

样例3:

输入:a = [[2, 4], [6, 8]]
输出:[[6, 12], [18, 24]]

1. 题目分析

本题的核心目标是对给定的矩阵(以二维列表形式表示)中的每个元素按照特定规则进行转换,即偶数元素变为其自身的三倍,奇数元素保持不变,最终输出经过转换后的新矩阵。实现思路主要围绕着对二维列表的遍历以及根据元素奇偶性进行相应的处理操作来展开。

2. 解题思路

首先,定义函数solution接收二维列表a。通过外层for循环遍历a中的每一行(子列表),每次循环取出一行赋值给i。接着内层for循环遍历i里的每个元素j,判断其奇偶性,若j除以 2 余数为 0(即偶数),就将j乘以 3 后添加到临时列表it中;若j为奇数,则直接添加到it里。等内层循环结束,一行元素处理完,把it添加到结果列表res中。外层循环结束,所有行处理完,res就是转换后的矩阵,最后函数返回res

3. 完整代码

def solution(a: list) -> int:
    res = []
    for i in a:
        it = []
        for j in i:
            if(j % 2 == 0):
                it.append(j * 3)
            else :
                it.append(j)
        res.append(it)
    return res

if __name__ == '__main__':
    print(solution([[1, 2, 3], [4, 5, 6]]) == [[1, 6, 3], [12, 5, 18]])
    print(solution([[7, 8, 9], [10, 11, 12]]) == [[7, 24, 9], [30, 11, 36]])
    print(solution([[2, 4], [6, 8]]) == [[6, 12], [18, 24]])
    

4. 代码结构分析

  • 外层循环

for i in a:

这里通过 for 循环遍历输入的二维列表 a 中的每一个子列表(也就是每一行数据,如果将二维列表想象成表格形式的话),每次循环将一个子列表赋值给变量 i,用于后续内层循环的处理。

  • 内层循环

for j in i:
    if(j % 2 == 0):
        it.append(j * 3)
    else :
        it.append(j)

针对外层循环获取到的每个子列表 i,又通过内层的 for 循环来遍历子列表中的每一个整数元素 j。通过判断 j 除以 2 的余数是否为 0(即判断是否为偶数),如果是偶数就把 j 乘以 3 后添加到临时列表 it 中,如果是奇数则直接把 j 原封不动地添加到 it 中。每个内层循环结束后,it 列表就保存了处理后的一行数据。

  • 结果收集

res.append(it)

在完成对每个子列表元素的处理后(也就是内层循环结束后),将处理好的这一行数据所在的 it 列表添加到 res 列表中,这样 res 列表最终就会保存经过转换后的整个二维列表。

5. 复杂度分析

时间复杂度分析

  1. 外层循环 (for i in a)

    • 这部分循环遍历二维列表 a 的每个子列表。假设 a 中有 m 个子列表(即 a 有 m 行),外层循环的迭代次数是 m
  2. 内层循环 (for j in i)

    • 对于每个子列表 i,内层循环遍历其中的每个元素。假设第 i 个子列表包含 n_i 个元素,那么内层循环需要执行 n_i 次。
    • 每次内层循环执行的操作是常数时间操作:判断元素是否为偶数,并根据条件将结果添加到临时列表 it 中。
  3. 内层循环的时间复杂度

    • 对于每个子列表 i,内层循环的时间复杂度是 O(n_i),其中 n_i 是第 i 个子列表的长度。
  4. 总的时间复杂度

    • 假设二维列表 a 总共有 m 个子列表,第 i 个子列表包含 n_i 个元素,那么总的时间复杂度是: [ O\left(\sum_{i=1}^{m} n_i \right) ] 这个和就是 a 中所有子列表的元素总数,记作 M。因此,总的时间复杂度可以简化为 O(M),其中 M 是二维列表 a 中所有元素的总数。

空间复杂度分析

  1. 结果列表 res

    • 函数返回一个新的二维列表 res,它与输入列表 a 具有相同的结构。每个子列表 it 是经过处理的结果,最终存储在 res 中。因此,res 的空间复杂度与输入列表 a 中元素的总数相同,即 O(M),其中 M 是 a 中所有元素的总数。
  2. 临时列表 it

    • 在每次处理每个子列表时,都会创建一个临时列表 it 来存储该子列表处理后的结果。每次处理一个子列表时,it 的空间复杂度是 O(n_i),其中 n_i 是第 i 个子列表的长度。
    • it 是临时的,处理完每个子列表后,会被丢弃。因此,it 占用的空间是瞬时的,且最大空间使用为 O(n_i),而这个最大空间是与每个子列表的大小相关的,但它不会超过整个输入列表的大小。
  3. 总空间复杂度

    • 由于最终返回的新列表 res 包含所有处理后的元素,并且在处理每个子列表时使用的临时列表 it 也是按需创建并消耗的,因此总的空间复杂度为 O(M),其中 M 是 a 中元素的总数。