当前位置:   article > 正文

每日OJ题_DFS爆搜深搜回溯剪枝②_力扣526. 优美的排列

每日OJ题_DFS爆搜深搜回溯剪枝②_力扣526. 优美的排列

目录

力扣526. 优美的排列

解析代码


力扣526. 优美的排列

526. 优美的排列

难度 中等

假设有从 1 到 n 的 n 个整数。用这些整数构造一个数组 perm下标从 1 开始),只要满足下述条件 之一 ,该数组就是一个 优美的排列 :

  • perm[i] 能够被 i 整除
  • i 能够被 perm[i] 整除

给你一个整数 n ,返回可以构造的 优美排列 的 数量 。

示例 1:

输入:n = 2
输出:2
解释:
第 1 个优美的排列是 [1,2]:
    - perm[1] = 1 能被 i = 1 整除
    - perm[2] = 2 能被 i = 2 整除
第 2 个优美的排列是 [2,1]:
    - perm[1] = 2 能被 i = 1 整除
    - i = 2 能被 perm[2] = 1 整除

示例 2:

输入:n = 1
输出:1

提示:

  • 1 <= n <= 15
  1. class Solution {
  2. public:
  3. int countArrangement(int n) {
  4. }
  5. };

解析代码

       题意是在每一个位置上考虑所有的可能情况并且不能出现重复。所以可以通过深度优先搜索的方式,不断地枚举每个数在当前位置的可能性,并回溯到上一个状态,直到枚举完所有可能性,得到正确的结果。

        需要定义一个变量用来记录所有可能的排列数量,一个一维数组 visited 标记元素,然后从第一个位置开始进行递归。递归函数作用:在当前位置填入一个合理的数字,查找所有满足条件的排列。

  1. class Solution {
  2. bool vis[16];
  3. int ret;
  4. public:
  5. int countArrangement(int n) {
  6. dfs(1, n);
  7. return ret;
  8. }
  9. void dfs(int pos, int n)
  10. {
  11. if(pos == n + 1) // 下标从1到n
  12. {
  13. ++ret;
  14. return;
  15. }
  16. for(int i = 1; i <= n; ++i)
  17. {
  18. if(!vis[i] && (pos % i == 0 || i % pos == 0))
  19. {
  20. vis[i] = true;
  21. dfs(pos + 1, n);
  22. vis[i] = false;
  23. }
  24. }
  25. }
  26. };

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号