题目描述:
在组合数学中,如果一个排列中所有元素都不在原先的位置上,那么这个排列就被称为错位排列。
给定一个从 1 到 n 升序排列的数组,你可以计算出总共有多少个不同的错位排列吗?
由于答案可能非常大,你只需要将答案对 109+7 取余输出即可。

样例 1:
输入: 3
输出: 2
解释: 原始的数组为 [1,2,3]。两个错位排列的数组为 [2,3,1] 和 [3,1,2]。

注释:
n 的范围是 [1, 106]。

方法1:
主要思路:
(1)动态规划;
(2)定义动态转移方程,在增加第 i 个数时,组成的错位排列可以从之前的状态推导出来,第 i 个数可以找出 (i-1)个位置放置,对应的放的位置,比如是j,则 j 可分两种情形,一种是放置到 i 的位置,则剩余的(i-2)个数组成错位排列,j 不能放到第 i 个位置,则相当于是一个 (i-1)个数的错位排列,故dp[i]=(i-1)*(dp[i-1]+dp[i-2]);
(3)根据题意,增加求余操作即可;

class Solution {public:int findDerangement(int n) {if(n==1){return 0;}if(n==2){return 1;}vector<int> dp(n+1,0);dp[2]=1;for(long i=3;i<=n;++i){dp[i]=(int)((i-1)*(dp[i-1]+dp[i-2])%1000000007);}return dp[n];}
};

方法2:
主要思路:
(1)每个位置的错位排列的数量只和前两个位置的相关,故可以减少内存的使用,只是用两个辅助变量即可;

class Solution {public:int findDerangement(int n) {if(n==1){return 0;}if(n==2){return 1;}int pre=0;int cur=1;for(long i=3;i<=n;++i){int tmp=(int)((i-1)*(pre+cur)%1000000007);pre=cur;cur=tmp;}return cur;}
};

634 寻找数组的错位排列相关推荐

  1. java错位_【LeetCode(Java) - 634】寻找数组的错位排列

    [LeetCode(Java) - 634]寻找数组的错位排列 [LeetCode(Java) - 634]寻找数组的错位排列 文章目录 1.题目描述 2.解题思路 3.解题代码 1.题目描述 2.解 ...

  2. 【LeetCode - 634】寻找数组的错位排列

    文章目录 1.题目描述 2.解题思路 3.解题代码 1.题目描述 2.解题思路   把题目转换为:对一个完美排序的序列,转换成错位排列,共有多少种排法.   先拿数字 n 开刀,有 n-1 个位置可以 ...

  3. LeetCode-Python-634. 寻找数组的错位排列(数学 + 错排公式)

    在组合数学中,如果一个排列中所有元素都不在原先的位置上,那么这个排列就被称为错位排列. 给定一个从 1 到 n 升序排列的数组,你可以计算出总共有多少个不同的错位排列吗? 由于答案可能非常大,你只需要 ...

  4. 容斥原理应用之:错位排列

    容斥原理应用之:错位排列 先解释一下什么是错位排列,原先的值不在原先的位置上,就是错误排列,比如下面这两个数组: <?php$array=[0=>0,1=>1,2=>2,3=& ...

  5. NYOJ 912 领帽子(全错位排列)

    领帽子 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 有n个人在参加晚会时寄存了自己的帽子.可是保管人忘记放寄存号,当每个人领取帽子时,他只能随机选择一顶帽子交给寄存人 ...

  6. 编程之美2.10 寻找数组中的最大值和最小值

    这个问题其实很容易解决,就是循环遍历一遍数组,然后找到数组中存在的最大值和最小值就可以了,书中主要讨论的问题是比较次数较小的方法,不过,书中已经证明了,无论用什么方法最少的比较次数也就是循环遍历一遍的 ...

  7. python 寻找数组的中心索引_Leetcode724:寻找数组的中心索引(java、python3)

    寻找数组的中心索引 给定一个整数类型的数组 nums,请编写一个能够返回数组"中心索引"的方法. 我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相 ...

  8. 寻找数组变化:树形结构,分治模型

    寻找数组变化 给定数组arr = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1],返回第一个1的下标 很明显需要借助于二分查找,二分查找轻微变形就可以实现 第一种思 ...

  9. java 中文 音序,java 中文字符串数组按照音序排列

    java 中文字符串数组按照音序排列 复制代码 代码如下: public class SortComparator implements Comparator{ public int compare( ...

最新文章

  1. JAVA取数两个数组交集,考虑重复和不重复元素
  2. android settings源代码分析(2)
  3. 玩客云刷windows做服务器_精选 | 搭建一个私人服务器如何?
  4. java 串口 rxtx_【Java】基于RXTX的Java串口通信
  5. 51nod 1428 bzoj 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚
  6. 模板字符串竟然还有这种用法
  7. 计算机论文对比实验怎么做,如何查找别人论文(计算机类文献)中实验部分的代码?...
  8. PHP发币,处理货币价值的PHP库
  9. 【EM算法】小波域隐马尔科夫树模型参数的EM算法估计MATLAB仿真
  10. VMware虚机丢失vmdk文件恢复方案解析
  11. mysql analyze_mysql analyze和optimize
  12. 初级基础HTML CSS实现二级下拉菜单
  13. 十问数据库:问来路,问现在,问未来
  14. 线性代数代码实现(五)求矩阵的逆(C++)
  15. Java学习软件安装详解
  16. 点钞机语音怎么打开_弱弱问一下验钞机怎么开声音
  17. python使用pandas中的to_json函数将dataframe数据写入json文件中
  18. 《leetCode》:Kth Largest Element in an Array
  19. 海康威视 curl 获取录像机nvr下所有摄像头的信息
  20. Linux设置JAR包开机自启

热门文章

  1. Java开发微信小程序订阅消息推送
  2. 记录一次参加D2前端技术论坛的杭州之行 1
  3. 用WKWebView写个h5容器加载mpaas的离线包在线地址的步骤
  4. HDU1201(题解)18岁生日
  5. char类型变量占几个字节的内存存储 [Java]
  6. 中国建议以新储备货币替代美元获联合国支持
  7. RHEL6系统上配置磁盘阵列(RAID)
  8. 5G VS WiFi6,实力大比拼!
  9. Front-end Internal error: Failed to analyze declaration .kts运行报错问题,创建kotlin script运行报错
  10. “ICO 融资轮”将成为常态