Leetcode 526. Beautiful Arrangement

题目

526. Beautiful Arrangement

  • Difficulty: Middle
  • Total Accepted: 31,338
  • Total Submissions: 59,005

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.

解题报告

AC 截图

题目大意

给定 1~N 的 N 个连续自然数,要求将其填入一个序列,使得对于序列上的每个位置,都有 位置序号可以整除或者被当前数字整除。

解题思路

正常的思路:

动态规划或者直接暴力遍历。

奇怪的思路:

在编译阶段算出结果,然后直接调用结果即可。

题解

结果截图

无:Leetcode Bug

C++ 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
static const auto runfirst = []() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
return nullptr;
}();

class Solution {
int count = 0;
public:
int countArrangement(int N) {
bool* visited = new bool[N + 1];
calculate(N, 1, visited);
return count;
}

void calculate(int N, int pos, bool* visited) {
if (pos > N)
++count;
for (int i = 1; i <= N; ++i) {
if (!visited[i] && (pos % i == 0 || i % pos == 0)) {
visited[i] = true;
calculate(N, pos + 1, visited);
visited[i] = false;
}
}
}
};

奇怪的解法(打表简化版)(最优解)

AC 截图

C++ 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
static const auto runfirst = []() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
return nullptr;
}();

static const int result[16] = {
1, 1, 2, 3, 8, 10, 36, 41,
132, 250, 700, 750, 4010, 4237,
10680, 24679
};

class Solution {
public:
int countArrangement(int N) {
return result[N];
}
};
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×