2021-01-03 Daily-Challenge

Today is Sunday, I gonna review the tasks I've done this week, and finish today's leetcode's January LeetCoding Challenge with cpp.

January LeetCoding Challenge 3

Description

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:

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

Given an integer n, return the number of the beautiful arrangements that you can construct.

Example 1:

Input: n = 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.

Example 2:

Input: n = 1
Output: 1

Constraints:

  • 1 <= n <= 15

Solution

simple dfs

class Solution {
    int answer;
    int n;
    vector<bool> used;
    void dfs(int index) {
        if(index == n+1) {
            answer += 1;
            return;
        }
        for(int i = 1; i <= n; ++i) {
            if(!used[i] && (i % index == 0 || index % i == 0)) {
                // cout << i << ' ' << index << endl;
                used[i] = true;
                dfs(index + 1);
                used[i] = false;
            }
        }
    }
public:
    int countArrangement(int n) {
        this->n = n;
        answer = 0;
        used.resize(n+1);
        dfs(1);
        return answer;
    }
};