leetcode 526. Beautiful Arrangement 递归实现全排列 + 经典深度优先遍历DFS做法
2017-12-17 09:16
393 查看
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.
本题题意很简单,直接深度优先遍历DFS即可
建议和leetcode 667. Beautiful Arrangement II 双指针遍历
代码如下:
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.
本题题意很简单,直接深度优先遍历DFS即可
建议和leetcode 667. Beautiful Arrangement II 双指针遍历
代码如下:
#include <iostream> #include <vector> #include <map> #include <set> #include <queue> #include <stack> #include <string> #include <climits> #include <algorithm> #include <sstream> #include <functional> #include <bitset> #include <numeric> #include <cmath> using namespace std; class Solution { public: int count = 0; int countArrangement(int n) { vector<bool> visit(n + 1, false); dfs(visit, 1, n); return count; } void dfs(vector<bool>& visit, int index, int size) { if (index >= size+1) { count++; return; } else { for (int i = 1; i <= size; i++) { if (visit[i] == false && (index % i == 0 || i % index == 0)) { visit[i] = true; dfs(visit, index + 1, size); visit[i] = false; } } } } };
相关文章推荐
- leetcode 97. Interleaving String(字符串交错出现) DFS深度优先遍历 + 很明显很经典的DP动态规划做法
- leetcode 139. Word Break 深度优先遍历DFS按照index递归搜索 + 很棒的动态规划DP做法
- leetcode 417. Pacific Atlantic Water Flow可以到达两边的点+经典DFS深度优先遍历做法
- leetcode 329. Longest Increasing Path in a Matrix 矩阵中寻找最长递增序列 + 一个典型的深度优先遍历DFS的做法
- leetcode 654. Maximum Binary Tree 递归构造最大二叉树 + 深度优先遍历DFS
- leetcode 529. Minesweeper 扫雷游戏 + 经典的DFS深度优先遍历
- leetcode 37. Sudoku Solver 一个经典的DFS深度优先搜索的做法
- leetcode 464. Can I Win 100相加游戏 + 一个十分棒的深度优先遍历DFS的做法
- leetcode 491. Increasing Subsequences所有的递增序列 + 一个典型的深度优先遍历DFS的做法
- leetcode 473. Matchsticks to Square 火柴摆正方形 + 一个经典深度优先遍历DFS的应用
- leetcode 508. Most Frequent Subtree Sum 子树和 + 一个简单的DFS深度优先遍历的做法
- leetcode 606. Construct String from Binary Tree 前序遍历 + 深度优先遍历DFS
- leetcode 669. Trim a Binary Search Tree 修建二叉搜索树BST + 深度优先遍历DFS
- leetcode 650. 2 Keys Keyboard 最小复制粘贴次数 + 深度优先遍历DFS
- (百度笔试)简要说明树的深度优先、广度优先遍历算法,及非递归实现的特点
- leetcode 404. Sum of Left Leaves 所有左孩子叶节点之和计算 + 深度优先遍历DFS
- 第12周项目3-(1)图遍历算法实现、实现深度优先遍历—DFS
- 简要说明树的深度优先、广度优先遍历算法,及非递归实现的特点
- leetcode 513. Find Bottom Left Tree Value 最左边的值 + 一个简单的DFS深度优先遍历
- (百度笔试)简要说明树的深度优先、广度优先遍历算法,及非递归实现的特点