-
题目链接 https://leetcode-cn.com/problems/beautiful-arrangement/submissions/
-
题目描述
-
假设有从 1 到 N 的 N 个整数,如果从这 N 个数字中成功构造出一个数组,使得数组的第 i 位 (1 <= i <= N) 满足如下两个条件中的一个,我们就称这个数组为一个优美的排列。条件:
- 第 i 位的数字能被 i 整除
- i 能被第 i 位上的数字整除
-
现在给定一个整数 N,请问可以构造多少个优美的排列?
-
输入: 2 输出: 2 解释: 第 1 个优美的排列是 [1, 2]: 第 1 个位置(i=1)上的数字是1,1能被 i(i=1)整除 第 2 个位置(i=2)上的数字是2,2能被 i(i=2)整除 第 2 个优美的排列是 [2, 1]: 第 1 个位置(i=1)上的数字是2,2能被 i(i=1)整除 第 2 个位置(i=2)上的数字是1,i(i=2)能被 1 整除
-
-
解题思路
- 回溯法:根据题设要求,将1~N按下标递增的顺序填数,填满一个就说明找到一个优美的数组
-
代码
- python
class Solution: def countArrangement(self, N: int) -> int: vis = [0] * (N + 1) ans = 0 def _dfs(index): nonlocal ans, vis if index == N + 1: ans += 1 return for i in range(1, N + 1): if not vis[i] and (i % index == 0 or index % i == 0): vis[i] = 1 _dfs(index + 1) vis[i] = 0; _dfs(1) return ans
- C++
class Solution { public: int countArrangement(int N) { vector<int> vis(N + 1, 0); int ans = 0; _dfs(vis, ans, 1, N + 1); return ans; } void _dfs(vector<int>& vis, int &ans, int index, int N){ if(index == N) ans ++; else{ for(int i = 1; i < N; i++){ if(not vis[i] and (i % index == 0 or index % i == 0)){ vis[i] = 1; _dfs(vis, ans, index + 1, N); vis[i] = 0; } } } return ; } };
- python
leetcode 526. 优美的排列
最新推荐文章于 2021-08-22 14:05:19 发布