Beautiful Arrangement

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:

  1. The number at the ith position is divisible by i.

  2. 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:

  1. N is a positive integer and will not exceed 15.

class Solution {
    // Just try every possible number at each position
    public int countArrangement(int N) {
        char[] currState = new char[N + 1];
        Arrays.fill(currState, 'f'); // f means not selected, t means selected
        return helper(new HashMap<String, Integer>(), currState, 1);
    }

    public int helper(Map<String, Integer> map, char[] currState, int index) {
        if (index == currState.length)
            return 1;
        String key = String.valueOf(currState);
        if (map.containsKey(key))
            return map.get(key);
        int count = 0;
        for (int i = 1; i < currState.length; i++) {
            if (currState[i] == 'f' && (i % index == 0 || index % i == 0)) {
                currState[i] = 't';
                count += helper(map, currState, index + 1);
                currState[i] = 'f';
            }
        }
        map.put(key, count);
        return count;
    }
}

Last updated