📌  相关文章
📜  将数组拆分为最少数量的子集,子集的每个元素都可以被其最小值整除(1)

📅  最后修改于: 2023-12-03 15:09:37.204000             🧑  作者: Mango

题目描述

给定一个正整数数组nums,将它们分成若干个子集,要求每个子集的元素都可以被该子集中最小的元素整除,且子集个数最少。如果有多个解,返回任意一个解。

示例

输入:[1,2,3,4,5,6]

输出:[ [1,2,4], [3,6], [5] ]

解题思路

本题需要使用贪心算法,具体步骤如下:

  1. 将数组nums排序。
  2. 遍历数组,对于每个元素num,找到它可以放入的子集中最小的那个子集,若找不到则新建一个子集。
  3. 返回所有子集的集合。

具体实现细节见代码注释。

代码实现
class Solution:
    def splitArray(self, nums: List[int]) -> List[List[int]]:
        # 将数组排序,从小到大进行考虑
        nums.sort()
        # 用字典存储每个子集,键为子集的最小元素
        subsets = {}
        for num in nums:
            # 查找能够放入num的子集中最小的那个子集
            for k in subsets:
                if num % k == 0:
                    subsets[k].append(num)
                    subsets[num] = subsets[k]
                    del subsets[k]
                    break
            else:
                # 如果找不到,则新建一个子集
                subsets[num] = [num]
        # 返回所有子集的集合
        return list(subsets.values())
复杂度分析
  • 时间复杂度:$O(nlogn)$,其中n为数组长度。排序的时间复杂度为$O(nlogn)$,遍历数组的时间复杂度为O(n),对于每个元素在字典中查找的时间也不会超过$O(logn)$。
  • 空间复杂度:$O(n)$,存储子集的字典最多会占用n个元素的空间。