LeetCode 2610. 转换二维数组

LeetCode 2610. 转换二维数组

题目描述

给定一个整数数组 nums,请你创建一个满足以下条件的二维数组:

  • 二维数组应该只包含数组 nums 中的元素
  • 二维数组中的每一行都包含不同的整数
  • 二维数组的行数应尽可能少

返回结果数组。如果存在多种答案,则返回其中任何一种。

注意:
二维数组的每一行上可以存在不同数量的元素。

示例

示例 1:
输入:nums = [1,3,4,1,2,3,1]
输出:[[1,3,4,2],[1,3],[1]]
解释:根据题目要求可以创建包含以下几行元素的二维数组:
- 1,3,4,2
- 1,3
- 1
nums 中的所有元素都有用到,并且每一行都由不同的整数组成,所以这是一个符合题目要求的答案。
可以证明无法创建少于三行且符合题目要求的二维数组。
示例 2:
输入:nums = [1,2,3,4]
输出:[[4,3,2,1]]
解释:nums 中的所有元素都不同,所以我们可以将其全部保存在二维数组中的第一行。

思路分析

本题需要创建一个二维数组,满足如下条件:

  • 每一行中的元素不能重复;
  • 行数尽可能少。

解题思路:

  1. 频次统计:
    我们首先统计每个数字在 nums 中的出现次数,使用 Counter 来获取每个数字的频次。

  2. 逐行构建二维数组:
    我们需要确保每一行中都包含不同的数字,并且每个数字出现的次数尽可能少。我们可以使用一个循环,在每一行中添加所有可以添加的数字,直到这些数字的次数都用完。

  3. 构建每行:
    每一行可以包含尽量多的不同元素。我们从 Counter 中取出一个数字并放入当前行,直到该数字的出现次数为 0。

  4. 优化:
    我们希望得到最少的行数,所以每行尽量包含最多的不同数字。

代码实现

from collections import Counter
from typing import List

class Solution:
    def findMatrix(self, nums: List[int]) -> List[List[int]]:
        ans = []  # 用于存储结果
        cnt = Counter(nums)  # 统计每个数字的出现次数
        while cnt:  # 当仍有数字未被用完时
            row = list(cnt)  # 获取当前存在的所有数字
            ans.append(row)  # 将这行添加到结果中
            # 遍历当前所有数字,更新其出现次数
            for a in row:
                cnt[a] -= 1
                if cnt[a] == 0:
                    del cnt[a]  # 如果某个数字用完了,删除该数字
        return ans

代码解释

  1. 初始化:
    我们首先定义一个空列表 ans 来存放最终结果。通过 Counter(nums) 统计 nums 中每个数字出现的次数。

  2. 主循环:
    我们进入 while 循环,直到所有数字的出现次数都为 0。每次循环中,我们取出当前所有仍然存在的数字(即 cnt 中的所有键),并将它们作为一行添加到 ans 中。

  3. 更新计数器:
    在每一行添加后,我们会更新 cnt 中每个数字的出现次数。如果某个数字的次数减到 0,就从 cnt 中删除它。

  4. 返回结果:
    最终,返回 ans 即为题目要求的二维数组。

示例解析

示例 1:

输入:nums = [1, 3, 4, 1, 2, 3, 1]

  • 初始化 cnt{1: 3, 3: 2, 4: 1, 2: 1}
  • 第一行放置 1, 3, 4, 2,此时 cnt 变为 {1: 2, 3: 1}
  • 第二行放置 1, 3,此时 cnt 变为 {1: 1}
  • 第三行放置 1,此时 cnt 变为 {},结束循环。
  • 返回 [[1, 3, 4, 2], [1, 3], [1]]
示例 2:

输入:nums = [1, 2, 3, 4]

  • 初始化 cnt{1: 1, 2: 1, 3: 1, 4: 1}
  • 由于每个数字只出现一次,所有数字可以放在同一行。
  • 返回 [[4, 3, 2, 1]]

时间复杂度

  • 时间复杂度: O(n),其中 nnums 的长度。我们遍历每个数字并更新 Counter 中的计数,最多进行 n 次操作。
  • 空间复杂度: O(n),我们需要存储 Counter 中的计数和最终的二维数组 ans

总结

本题的关键在于如何通过 Counter 统计每个数字的频次,然后通过动态构建每一行来满足题目要求。通过不断选择可以放置在同一行的不同元素,我们可以实现尽可能少的行数,从而得到一个符合条件的二维数组。

你可能感兴趣的:(每日算法,leetcode,算法,数据结构)