1. Generate All Permutations and Validate
Intuition
Build the entire array of length N. Once a full permutation is assembled, loop through indices 1 to N to verify the divisibility property.
Algorithm
- Step 1: Generate all N! permutations of numbers from 1 to N using standard backtracking.
- Step 2: For each completed permutation, iterate through indices i = 1 to N.
- Step 3: Check if perm[i-1] is divisible by i or i is divisible by perm[i-1].
- Step 4: If all N positions satisfy the condition, increment the valid arrangement count.
#include <iostream>#include <vector> class Solution {public: bool isBeautiful(const std::vector<int>& perm, int n) { for (int i = 1; i <= n; i++) { if (perm[i - 1] % i != 0 && i % perm[i - 1] != 0) return false; } return true; } void permute(int index, int n, std::vector<int>& perm, std::vector<bool>& used, int& count) { if (index == n) { if (isBeautiful(perm, n)) count++; return; } for (int i = 1; i <= n; i++) { if (!used[i]) { used[i] = true; perm.push_back(i); permute(index + 1, n, perm, used, count); perm.pop_back(); used[i] = false; } } } int countArrangement(int n) { int count = 0; std::vector<int> perm; std::vector<bool> used(n + 1, false); permute(0, n, perm, used, count); return count; }}; int main() { Solution solver; std::cout << "Beautiful Arrangements for N = 2: " << solver.countArrangement(2) << "\n"; return 0;}Time & Space Complexity
- Time complexity:
O(N! * N)— Generates all N! permutations and verifies each in O(N) time. - Space complexity:
O(N)— O(N) recursion stack and visited array.