Beautiful Arrangement

Problem

Suppose you have N integers from 1 to N. We define a beautiful arrangement as an array that is constructed by these N numbers successfully if one of the following is true for the ith position (1 <= i <= N) in this array:

The number at the ith position is divisible by i. i is divisible by the number at the ith position. Now given N, how many beautiful arrangements can you construct?

Example 1:
Input: 2
Output: 2
Explanation: 

The first beautiful arrangement is [1, 2]:

Number at the 1st position (i=1) is 1, and 1 is divisible by i (i=1).

Number at the 2nd position (i=2) is 2, and 2 is divisible by i (i=2).

The second beautiful arrangement is [2, 1]:

Number at the 1st position (i=1) is 2, and 2 is divisible by i (i=1).

Number at the 2nd position (i=2) is 1, and i (i=2) is divisible by 1.

Note:
N is a positive integer and will not exceed 15.

Solution

Backtracking:

public class Solution {

    int res = 0; 

    public int countArrangement(int n) {
        if (n <= 0) return 0;
        helper(new boolean[n + 1], n, 1);
        return res;
    }

    private void helper(boolean[] visited, int n, int cur) {
        if (cur > n) {
            res++;
            return;
        }
        for (int i = 1; i <= n; i++) {
            if (!visited[i] && (cur % i == 0 || i % cur == 0)) {
                visited[i] = true;
                helper(visited, n, cur + 1);
                visited[i] = false;
            }
        }
    }
}

Analysis

This problem is about using permutations from 1 n and get the qualified result
We have boolean[] visited to mark whether the current number is visited
If so and it's divisible, we mark it visited and then call helper() method with cur + 1
Because of backtracking, we mark it visited[i] = false at the end

results matching ""

    No results matching ""