Skip to main content

Command Palette

Search for a command to run...

Solving Leetcode Interviews in Seconds with AI: Special Permutations

Updated
2 min read

Introduction

In this blog post, we will explore how to solve the LeetCode problem "2741" using AI. LeetCode is a popular platform for preparing for coding interviews, and with the help of AI tools like Chatmagic, we can generate solutions quickly and efficiently - helping you pass the interviews and get the job offer without having to study for months.

Problem Statement

You are given a 0-indexed integer array nums containing n distinct positive integers. A permutation of nums is called special if: For all indexes 0 <= i < n - 1, either nums[i] % nums[i+1] == 0 or nums[i+1] % nums[i] == 0. Return the total number of special permutations. As the answer could be large, return it modulo 109 + 7. Example 1: Input: nums = [2,3,6] Output: 2 Explanation: [3,6,2] and [2,6,3] are the two special permutations of nums. Example 2: Input: nums = [1,4,3] Output: 2 Explanation: [3,1,4] and [4,1,3] are the two special permutations of nums. Constraints: 2 <= nums.length <= 14 1 <= nums[i] <= 109

Explanation

Here's the solution:

  • Dynamic Programming with Bitmasking: Use a bitmask to represent which numbers have been used in the permutation so far. Store the count of special permutations ending at each number with a corresponding bitmask.
  • Iterative Construction: Build the permutations iteratively, starting from a single element and adding elements one by one while maintaining the special permutation property.
  • Modulo Arithmetic: Apply modulo operation (109 + 7) at each step to prevent overflow.

  • Runtime Complexity: O(n * 2n), where n is the number of elements in nums.

  • Storage Complexity: O(n * 2n)

Code

    def specialPerm(nums):
    n = len(nums)
    dp = {}
    MOD = 10**9 + 7

    def solve(mask, last):
        if mask == (1 << n) - 1:
            return 1

        if (mask, last) in dp:
            return dp[(mask, last)]

        ans = 0
        for i in range(n):
            if (mask >> i) & 1 == 0:
                if last == -1 or nums[i] % nums[last] == 0 or nums[last] % nums[i] == 0:
                    ans = (ans + solve(mask | (1 << i), i)) % MOD

        dp[(mask, last)] = ans
        return ans

    return solve(0, -1)

More from this blog

C

Chatmagic blog

2894 posts