📌  相关文章
📜  满足给定条件的数组可能的最大子集(1)

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

满足给定条件的数组可能的最大子集

问题描述

给定一个整数数组 nums,找到其中所有通过以下条件构造出的最大子集:

  1. 子集中的任意两个元素相除的结果均为整数。
  2. 子集中的所有元素按非降序排列。

示例 1: 输入: nums = [1,2,3] 输出: [1,2] (当然,[1,3] 也是可能的)

解题思路

思路1:动态规划

  • 给定数组 nums,定义 dp[i] 表示以 nums[i] 为结尾的最长子集;
  • 再定义一个指针j,指向 i 之前的元素,通过全局变量max变量来记录最长子集的长度;
  • 遍历数组nums,对于每个元素 nums[i],从头开始遍历一遍前面的数组元素 nums[j],如果 nums[i] % nums[j] == 0,那么就有 dp[i] = max(dp[i], dp[j]+1);
  • 由于最终要输出最长子集,所以要同时记录最大的子集长度 max_len 和其对应的下标 index;
  • 迭代完 nums 数组后,从 index 开始往前倒推子集。

思路2:贪心

  • 将nums升序排序;
  • 定义一个空的数组 result 和一个整数 max_len,对数组中的每个元素 nums[i] 进行如下操作:
    • 初始化max为0;
    • 找到 result 中最大的元素 t,满足 nums[i] % t == 0,将 nums[i] 加到 t 后面,且更新 max 的值;
    • 如果 max 大于 result 中的元素个数,则说明找到了新的最长子集,更新 result 和 max_len。
复杂度分析

思路1:动态规划

  • 时间复杂度:$O(n^2)$
  • 空间复杂度:$O(n)$

思路2:贪心

  • 时间复杂度:$O(nlogn+n^2)$,其中排序的时间复杂度为 $O(nlogn)$,遍历数组的时间复杂度为 $O(n^2)$
  • 空间复杂度:$O(n)$
代码示例

思路1:动态规划

class Solution:
    def largestDivisibleSubset(self, nums: List[int]) -> List[int]:
        n = len(nums)
        if n <= 1:
            return nums

        nums.sort()
        dp = [1]*n
        max_len = 1
        index = 0

        for i in range(1, n):
            for j in range(i):
                if nums[i] % nums[j] == 0:
                    dp[i] = max(dp[i], dp[j]+1)
            if dp[i] > max_len:
                max_len = dp[i]
                index = i

        result = []
        t = nums[index]
        for i in range(index, -1, -1):
            if t % nums[i] == 0 and dp[i] == max_len:
                result.append(nums[i])
                t = nums[i]
                max_len -= 1

        return result

思路2:贪心

class Solution:
    def largestDivisibleSubset(self, nums: List[int]) -> List[int]:
        n = len(nums)
        if n <= 1:
            return nums

        nums.sort()
        result = []
        max_len = 0

        for i in range(n):
            temp = []
            for j in range(max_len):
                if nums[i] % result[j] == 0:
                    temp.append(result[j])
            temp.append(nums[i])
            result = temp
            max_len = max(max_len, len(result))

        return result