首页 > 编程语言 >算法基础之全排列(递归)

算法基础之全排列(递归)

时间:2023-01-03 12:32:08浏览次数:45  
标签:index 排列 end 递归 int 之全 len 算法 数组

全排列(递归)

全排列就是从第一个数字起每个数字分别与他后面的数进行交换。

去重的全排列就是从第一个数起每个数分别与它后面非重复出现的数字交换。

全排列(不去重)


// 搜索
// a 为 需要全排列的数组
// len为需要全排列的数组长度
// index为当前选取到第几位数。(index是从0开始的)
void dfs(int* a, int len, int index){
if (len <= index) {
show(a);
}
// 枚举排列中第index个位置上的元素
// 循环代表的意思:可以把下标为index ~ len-1的数值一一置换到a[index] 中,然后依次求解每个递归问题。
for (int i = index; i < len; i++) {
swap(a[index], a[i]);
dfs(a, len, index+1);
swap(a[index], a[i]);
}
}

全排列去重

// 判断是否应该交换。
// 即判断[start,end) 中是否有与a[end]相等的,
// 例子: abccc 避免 c 与 c进行交换,产生重复。
bool isSwap(int* a, int start, int end) {
for (int i = start; i < end; i++) {
if (a[i] == a[end]) {
return false;
}
}
return true;
}
// 搜索
// a 为 需要全排列的数组
// len为需要全排列的数组长度
// index为当前选取到第几位数。(index是从0开始的)
void dfs(int* a, int len, int index){
// 表明选好了一个排列 (index是从0开始的),输出
if (len <= index) {
show();
}
// 枚举排列中第index个位置上的元素
// 循环代表的意思:可以把下标为index ~ len-1的数值一一置换到a[index] 中,然后依次求解每个递归问题。
// 加上isSwap判断是为了避免重复,
for (int i = index; i < len; i++) {
if (index == 0 && a[i] == 0) continue;
if (isSwap(a, index, i)) {
swap(a[index], a[i]);
dfs(a, len, index+1);
swap(a[index], a[i]);

全排列(不去重)的个数

学过排列组合的应该都知道:


n ! n!n!

去重全排列的个数

公式:


n ! ( k 1 ) ! ∗ ( k 2 ) ! ∗ ( k 3 ) ! ∗ . . . ∗ ( k p ) ! \frac{n!}{(k1)! * (k_2)! * (k_3)! * ... * (k_p)!}

(k1)!∗(k

2

)!∗(k

3

)!∗...∗(k

p

)!

n!

n : 串长度(需要全排列的数组长度)

k i k_{i}k

i

:串中第i种元素出现的次数

p:串中不同元素的个数。

例如:数组为{1,1,2,3}


数组长度为4,即n=4,

1的次数是2

2的次数是1

3的次数是1


所以:


4 ! 2 ! ∗ 1 ! ∗ 1 ! \frac{4!}{2!*1!*1!}

2!∗1!∗1!

4!

即12种。



标签:index,排列,end,递归,int,之全,len,算法,数组
From: https://blog.51cto.com/u_13758447/5985276

相关文章

  • 【Leetcode】天堂硅谷·数字经济算法编程大赛(虚拟)
    感受题目清单​​​https://leetcode.cn/contest/hhrc2022/​​周末比较忙,两场比赛都没有参加,打的虚拟赛。题解A.化学反应实验室内有一些化学反应物,其中的任意两种反应物......
  • 牛客寒假算法基础集训营4-J-Applese 的减肥计划
    链接:​​https://ac.nowcoder.com/acm/contest/330/J​​牛客网 已知Applese两只手分别产生的力的大小,以及它们之间的夹角,试求两力合力的大小。输入描述:仅一行三个整......
  • 牛客寒假算法基础集训营4-B-Applese 走方格
    链接:​​https://ac.nowcoder.com/acm/contest/330/B​​​牛客网 在这个游戏中,它位于一个n行m列的方阵中的左上角(坐标为(0,0),行的序号为0∼n−10∼n−1,列的序号为0......
  • 函数和递归
    函数是什么库函数自定义函数函数参数函数调用函数的嵌套调用和链式访问函数的声明和定义函数递归函数是什么?维基百科定义:子程序在计算机科学中,子程序是一个大型程序中的部分......
  • 递归算法
    一、递归实现N!.代码实现:packagecn.test;/***@author徐庶*@date2016年9月6日*/publicclassRecursive{//递归privatestaticlongfactorial(intn){if(n......
  • LRU、LFU、FIFO算法总结
    一、概述(1)FIFO:FirstInFirstOut,先进先出(2)LRU:LeastRecentlyUsed,最近最少使用(3)LFU:LeastFrequentlyUsed,最不经常使用  FIFO表示先进先出,类似于对列,在数据的结构......
  • runoob-数据结构与算法
    https://www.runoob.com/data-structures/data-structures-tutorial.html数据结构(英语:datastructure)是计算机中存储、组织数据的方式。数据结构是一种具有一定逻辑关系,......
  • 关于递归Collapse 折叠面板和实现分层折叠互斥效果
    近期要用Collapse折叠面板实现一个递归效果,直接上效果图,实现最终效果是每一层的内容互斥,组件递归的的时候为了实现每一层内容互斥要给每一个el-collapse加上一个v-model,......
  • 算法之摩尔投票法
    今天接触了一个很有意思的算法,用于求众数。用力扣的题做起来比较有感觉,https://leetcode.cn/problems/majority-element/。当一群人投票表决某一个事时,想找出占人数一半......
  • 代码随想录算法训练营第六天|LeetCode 242.有效的字母异位词、LeetCode 349. 两个数组
    242.有效的字母异位词文章:代码随想录(programmercarl.com)视频:https://www.bilibili.com/video/BV1YG411p7BAclassSolution{public:boolisAnagram(strings,......