leetcode-优美的排列
假设有从 1 到 N 的 N 个整数,如果从这 N 个数字中成功构造出一个数组,使得数组的第 i 位 (1 <= i <= N) 满足如下两个条件中的一个,我们就称这个数组为一个优美的排列。条件:
- 第 i 位的数字能被 i 整除
- i 能被第 i 位上的数字整除
现在给定一个整数 N,请问可以构造多少个优美的排列?
示例1:
输入: 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 整除
说明:
- N 是一个正整数,并且不会超过15。
方法1:
思路: 对全排列进行改造。 void dfs函数变为int dfs 函数。
现在 int dfs()函数的伪代码如下:
int dfs(int len){
if(len==某个数){
return ;
}
int res=;
循环过程——————{
res+= dfs(len+,);
}
return res;
}
同时因为是通过筛选,因此在交换过程中加入判断条件,代码如下:
JAVA
class Solution {
public int countArrangement(int N) {
int[] nums=new int[N];
for(int i=0;i<N;i++){
nums[i]=i+1;
}
return dfs(nums,0);
}
public void swap(int[] nums,int i,int j){
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
//DFS返回的是int类型。
public int dfs(int[] nums,int len){
if(len==nums.length){
return 1; //只要能够进行到回溯的终止条件,也就是出现了符合的排列,结果+1.
}
int res=0;
for(int i=len;i<nums.length;i++){
//nums[i] num[len] 进行交换,由于Len可能是0,因此+1.这里nums[len]%(i+1)==0反而不成立!
if(nums[len]%(len+1)==0||(len+1)%nums[i]==0){
swap(nums,i,len);
res+=dfs(nums,len+1);
swap(nums,i,len);
}
}
return res;
}
}
c++:
class Solution {
public:
int dfs(vector<int>& nums,int len){
if(len==nums.size()){
return 1;
}
int res=0;
for(int i=len;i<nums.size();i++){
if(nums[i]%(len+1)==0||(len+1)%nums[i]==0){
swap(nums[i],nums[len]);
res+=dfs(nums,len+1);
swap(nums[i],nums[len]);
}
}
return res;
}
int countArrangement(int N) {
vector<int> nums(N);
for(int i=0;i<N;i++)nums[i]=i+1;
return dfs(nums,0);
}
};
方法2:
class Solution {
public:
//思路:对每一位从1-N的数字进行判断,比如1 2 3 4 5 .
//一号位可以放置:1 2 3 4 5.二号位可以放置:1 2 4 三号位只能放置:3 四号位可以放置1 2 4
//同时已经放置过的数字不能再使用了,用vis[i]==1来表示。
//判断的条件为:if(vis[i]==0&&(i%len==0||len%i==0))
int countArrangement(int N) {
int count=;
vector<int> vis(N+,);
dfs(count,N,vis,);
return count;
}
void dfs(int& count,int N,vector<int>& vis,int len){
if(len>N){
count++;
return;
}
for(int i=;i<=N;i++){
if(vis[i]==&&(i%len==||len%i==)){
vis[i]=;
dfs(count,N,vis,len+);
vis[i]=;
}
}
} };
leetcode-优美的排列的更多相关文章
- Leetcode 667.优美的排列II
优美的排列II 给定两个整数 n 和 k,你需要实现一个数组,这个数组包含从 1 到 n 的 n 个不同整数,同时满足以下条件: ① 如果这个数组是 [a1, a2, a3, ... , an] ,那 ...
- Leetcode 526.优美的排列
优美的排列 假设有从 1 到 N 的 N 个整数,如果从这 N 个数字中成功构造出一个数组,使得数组的第 i 位 (1 <= i <= N) 满足如下两个条件中的一个,我们就称这个数组为一 ...
- Java实现 LeetCode 667 优美的排列 II(暴力)
667. 优美的排列 II 给定两个整数 n 和 k,你需要实现一个数组,这个数组包含从 1 到 n 的 n 个不同整数,同时满足以下条件: ① 如果这个数组是 [a1, a2, a3, - , an ...
- Java实现 LeetCode 526 优美的排列(DFS)
526. 优美的排列 假设有从 1 到 N 的 N 个整数,如果从这 N 个数字中成功构造出一个数组,使得数组的第 i 位 (1 <= i <= N) 满足如下两个条件中的一个,我们就称这 ...
- [Swift]LeetCode526. 优美的排列 | Beautiful Arrangement
Suppose you have N integers from 1 to N. We define a beautiful arrangement as an array that is const ...
- leetcode.数组.667优美的排列II-Java
1. 具体题目 给定两个整数 n 和 k,你需要实现一个数组,这个数组包含从 1 到 n 的 n 个不同整数,同时满足以下条件:① 如果这个数组是 [a1, a2, a3, ... , an] ,那么 ...
- [LeetCode] Arranging Coins 排列硬币
You have a total of n coins that you want to form in a staircase shape, where every k-th row must ha ...
- LeetCode 77 Combinations(排列组合)
题目链接:https://leetcode.com/problems/combinations/#/description Problem:给两个正数分别为n和k,求出从1,2.......n这 ...
- 31,Leetcode下一个排列 - C++ 原地算法
题目描述 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常 ...
- LeetCode.1175-质数排列(Prime Arrangements)
这是小川的第413次更新,第446篇原创 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第264题(顺位题号是1175).返回1到n的排列数,以使质数处于质数索引(索引从1开始).(请 ...
随机推荐
- xcode Aborting commit: '~/Pods' remains in tree-conflict 错误的解决办法
在网上找了很多, 最后找到一个比较简单有较的 filename: 是出错的文件的绝对路径: xcode会提示 然后开终端: 1:svn remove --force filename 2:svn re ...
- SQL修改字段默认值、获取字段默认值
一.SQL修改字段默认值 alter table 表名 drop constraint 约束名字 说明:删除表的字段的原有约束 alter table 表名 add constraint 约束名字 D ...
- wordpress安装(ubuntu+nginx+php+mariadb)
一. 环境 ubuntu12.04.4 nginx 1.6.0 mariadb 10.0 更新系统补丁 sudo apt-get update sudo apt-get dist-upgrade ...
- Linux Shell常用技巧(十)
二十. 通过管道组合Shell命令获取系统运行数据: 1. 输出当前系统中占用内存最多的5条命令: #1) 通过ps命令列出当前主机正在运行的所有进程. #2) 按照第五个字段基于数值 ...
- UML架构设计师必备神器
UML-架构设计师必备神器 做过Java开发的一定都听过UML,也都能感觉到它的重要性.由其是在网上搜索一些高级技术介绍,写的好的.阅读量高的.让初.中级程序员容易看懂的.思路清晰的文章一定有UML类 ...
- Java并发编程(八)线程间协作(上)
多线程并发执行时,不同的线程执行的内容之间可能存在一些依赖关系,比如线程一执行a()方法和c()方法,线程二执行b()方法,方法a()必须在方法b()之前执行,而方法c()必须在方法b()之后执行.这 ...
- Java---Huffman树的实现
什么是哈弗曼树 1.哈弗曼树是最优二叉树,树的带权路径长度最小的一个二叉树. 2.带权路径长度为根节点到该节点的路径长度和该节点权重的乘积.3.路径长度为当前节点到另一个节点所经过的分支的个数(边的个 ...
- jquery里遍历普通数组和多维数组的方法及实例
jquery里遍历数组用的是$.each,下面站长给大家几个具体的实例: 实例1.遍历一个普通的一维数组: 1 2 3 4 5 6 7 8 <script> //声明数据有下面两种方式 / ...
- linux下环境变量PS1-命令提示符
1.字体颜色 1.1颜色及对应数字 颜色表 前景 背景 颜色 30 40 黑色 echo -e "\e[30mforegroud\e[m\e[40mbackground\e[m& ...
- Qt界面编程基本操作
Qt界面编程基本操作 了解基本代码构成 类widget的头文件widget.h如下: #ifndef WIDGET_H #define WIDGET_H #include <QWidget> ...