less than 1 minute read

Problem Statement

problem

Brute Force [TLE]

class Solution:
    def largestDivisibleSubset(self, nums: List[int]) -> List[int]:
        N = len(nums)
        res = []
        nums.sort()

        def dfs(start, curr):
            if start == N:
                return curr, len(curr)
            include, len1 = None, 0
            if nums[start] % curr[-1] == 0:
                include, len1 = dfs(start + 1, curr + [nums[start]])
            exclude, len2 = dfs(start + 1, curr)

            if len1 > len2:
                return include, len1
            return exclude, len2


        for i in range(N):
            curr, _ = dfs(i + 1, [nums[i]])
            if len(curr) > len(res):
                res = curr[:]
        return res

Dynamic Programming

class Solution:
    def largestDivisibleSubset(self, nums: List[int]) -> List[int]:
        if not nums:
            return []

        nums.sort()
        n = len(nums)
        dp = [1] * n  # dp[i] = size of the largest subset ending with nums[i]
        prev = [-1] * n  # To reconstruct the subset

        max_len = 0
        max_index = 0

        for i in range(n):
            for j in range(i):
                if nums[i] % nums[j] == 0 and dp[j] + 1 > dp[i]:
                    dp[i] = dp[j] + 1
                    prev[i] = j
            if dp[i] > max_len:
                max_len = dp[i]
                max_index = i

        # Reconstruct the largest subset
        res = []
        while max_index != -1:
            res.append(nums[max_index])
            max_index = prev[max_index]

        return res[::-1]