假设有从 1 到 N 的 N 个整数,如果从这 N 个数字中成功构造出一个数组,使得数组的第 i 位 (1 <= i <= N) 满足如下两个条件中的一个,我们就称这个数组为一个优美的排列。条件:

  1. 第 i 位的数字能被 i 整除
  2. 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 整除

说明:

  1. N 是一个正整数,并且不会超过15。

参考博客:Beautiful Arrangement

方法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-优美的排列的更多相关文章

  1. Leetcode 667.优美的排列II

    优美的排列II 给定两个整数 n 和 k,你需要实现一个数组,这个数组包含从 1 到 n 的 n 个不同整数,同时满足以下条件: ① 如果这个数组是 [a1, a2, a3, ... , an] ,那 ...

  2. Leetcode 526.优美的排列

    优美的排列 假设有从 1 到 N 的 N 个整数,如果从这 N 个数字中成功构造出一个数组,使得数组的第 i 位 (1 <= i <= N) 满足如下两个条件中的一个,我们就称这个数组为一 ...

  3. Java实现 LeetCode 667 优美的排列 II(暴力)

    667. 优美的排列 II 给定两个整数 n 和 k,你需要实现一个数组,这个数组包含从 1 到 n 的 n 个不同整数,同时满足以下条件: ① 如果这个数组是 [a1, a2, a3, - , an ...

  4. Java实现 LeetCode 526 优美的排列(DFS)

    526. 优美的排列 假设有从 1 到 N 的 N 个整数,如果从这 N 个数字中成功构造出一个数组,使得数组的第 i 位 (1 <= i <= N) 满足如下两个条件中的一个,我们就称这 ...

  5. [Swift]LeetCode526. 优美的排列 | Beautiful Arrangement

    Suppose you have N integers from 1 to N. We define a beautiful arrangement as an array that is const ...

  6. leetcode.数组.667优美的排列II-Java

    1. 具体题目 给定两个整数 n 和 k,你需要实现一个数组,这个数组包含从 1 到 n 的 n 个不同整数,同时满足以下条件:① 如果这个数组是 [a1, a2, a3, ... , an] ,那么 ...

  7. [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 ...

  8. LeetCode 77 Combinations(排列组合)

    题目链接:https://leetcode.com/problems/combinations/#/description    Problem:给两个正数分别为n和k,求出从1,2.......n这 ...

  9. 31,Leetcode下一个排列 - C++ 原地算法

    题目描述 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常 ...

  10. LeetCode.1175-质数排列(Prime Arrangements)

    这是小川的第413次更新,第446篇原创 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第264题(顺位题号是1175).返回1到n的排列数,以使质数处于质数索引(索引从1开始).(请 ...

随机推荐

  1. 修改linux系统的默认语言

    修改linux系统的默认语言: 1.全局修改:         所有用户都是同一种统一的语言设置          修改/etc/sysconfig/i18n文件          vi /etc/s ...

  2. Loadrunner测试webservice协议总结

    Loadrunner测试webservice协议总结 一.协议选择 1.打开Virtual user generator,新建脚本,选择webservice协议

  3. 面试 : C语言 功底 被 鄙视了

    第一道:被鄙视 的 C语言语法问题 请看 下面 程序 : 错误程序: void GetMemory( char *p ){ p = (char *) malloc( 100 );}void Test( ...

  4. cocos2dx lua 一键资源管理PowerShell脚本实现

    特别说明 此管理脚本不包含图片资源加密,热更新资源文件列表是md5 和 文件路径构成的txt,如下 脚本文件是放在和res src 同级的文件夹里面 脚本内容如下 clear $PSDefaultPa ...

  5. JNDI数据源(在Tomcat下配置JNDI多数据源实例)

    一,添加数据库驱动包加入classpath. 这里我用到了oracle和mysql.所以由两个jar包:ojdbc14.jar和mysql-connector-java-5.1.13-bin.jar. ...

  6. Mac 模拟慢速网络

    作为开发者,为了提升用户体验,有时需要模拟不同环境的网络.Mac环境下模拟慢速网络可以使用苹果官方提供的工具:Network Link Conditioner. 1.点击苹果开发者网站提供的下载页面, ...

  7. elementUi + express 上传图片

    // 前端代码 <el-upload drag action="http://localhost:4001/article/uploadCoverImage" multipl ...

  8. Python 正则:前后界定和前后非界定

    在用正则去匹配识别手机号.QQ.微信号的时候,往往由于输入的文本可能非常的另类,比如,没有标点和隔断,这时`^`和`$`就用不上了. 不用其实也可以识别的,但是有个问题,手机后是11位数字,QQ是5~ ...

  9. Flume(1)-概述与组成架构

    一. 定义 Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统.Flume基于流式架构,灵活简单. 二. 优点 1. 可以和任意集中式存储进程集成. 2. ...

  10. pycharm社区版新建django文件不友好操作

    一.cmd操作 1.django-admin startproject (新建project名称) 2.在pycharm打开project,运行终端输入:python manage.py starta ...