元素无重复:

  如:2,5,8,9.

  思路:用递归的方法解决,对于2589,先输出所有以2开头的排列,然后输出5开头的排列.....(此处称为递归操作A)。以2开头的排列中,第一位是2,后面的是589,然后对589执行相同的递归操作A......

  代码如下:

  

 #include<iostream>
using namespace std;
void print_permutation(int n,int *A,int *B,int cur){//n为目标数组长度,cur为对全排列序列A递归操作的下标
if(cur==n){//递归出口
for(int i=;i<n;i++)//打印全排列序列
cout<<A[i]<<" ";
cout<<endl;
}
else
for(int i=;i<n;i++){//扫描目标数组
int ok=;
for(int j=;j<cur;j++){
if(A[j]==B[i]){
ok=;//对A中已有元素(cur下标前的元素)进行扫描,若发现A中已经存在B[i]的值时,说明B[i]元素已经排列过。
break;
}
}
if(ok){//若B[i]未排列过,则将B[i]添加到A序列末尾,将cur指针后移一位,进行下一步递归操作。
A[cur]=B[i];
print_permutation(n,A,B,cur+);
}
}
} int main(){
int a[]={};//全排列序列,即输出结果
int b[]={,,,};// 目标数组
print_permutation(,a,b,);
return ;
}

元素有重复:

  修改两个地方:

  1.因为元素可以重复,所以不能再用“A中是否已经存在B数组”的条件来决定是否添加B[i]元素。取而代之,分别对A,B数组扫描,只要A中的B[i]不超过B中的B[i]即可。

  2.在题目要求上,重复元素属于相同元素时,如1123的排列中1123和1123是等价的,只能算一种。我们最好先对B数组排个序(排序复杂度是nlogn,相较于两层循环的代,影响并不是很大),然后在最外层循环添上一个控制条件(i==0||B[i]!=B[i-1]),为的就是防止重复的元素又一次排列。

  代码如下:

  

 #include<iostream>
using namespace std;
void print_permutation(int n,int *A,int *B,int cur) {
if(cur==n) {
for(int i=; i<n; i++)
cout<<A[i]<<" ";
cout<<endl;
} else
for(int i=; i<n; i++) {
if(!i||B[i]!=B[i-]) {
int c1=,c2=;
for(int j=; j<cur; j++)//扫描A中已有B[i]的个数
if(A[j]==B[i]) c1++;
for(int j=; j<n; j++)//扫描B中所有B[i]的个数
if(B[j]==B[i]) c2++;
if(c1<c2) {
A[cur]=B[i];
print_permutation(n,A,B,cur+);
}
}
}
} int main() {
int a[]= {};
int b[]= {,,,};
print_permutation(,a,b,);
return ;
}

  

全排列递归算法(元素有重复与无重复,C++实现)的更多相关文章

  1. 从无重复大数组找TOP N元素的最优解说起

    有一类面试题,既可以考察工程师算法.也可以兼顾实践应用.甚至创新思维,这些题目便是好的题目,有区分度表现为可以有一般解,也可以有最优解.最近就发现了一个这样的好题目,拿出来晒一晒. 1 题目 原文: ...

  2. hunnu 11313 无重复元素序列的最长公共子序列转化成最长递增子序列 求法及证明

    题目:http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11313 湖师大的比赛,见我的另一篇水题题解,这里要说的 ...

  3. 算法练习之合并两个有序链表, 删除排序数组中的重复项,移除元素,实现strStr(),搜索插入位置,无重复字符的最长子串

    最近在学习java,但是对于数据操作那部分还是不熟悉 因此决定找几个简单的算法写,用php和java分别实现 1.合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两 ...

  4. lintcode: 最长无重复字符的子串

    题目 最长无重复字符的子串给定一个字符串,请找出其中无重复字符的最长子字符串. 例如,在"abcabcbb"中,其无重复字符的最长子字符串是"abc",其长度为 ...

  5. [LeetCode] 3. 无重复字符的最长子串

    题目链接:(https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/) 题目描述: 给定一个字符 ...

  6. Set.js--创建无重复值的无序集合

    Set 集合,不同于 Array,是一种没有重复值的集合. 以下代码出自于<JavaScript 权威指南(第六版)>P217,注意:这里并不是指 es6 / es2015 中的 Set ...

  7. day4——无重复字符的最长子串

    // 小白一名,0算法基础,艰难尝试算法题中,若您发现本文中错误, 或有其他见解,往不吝赐教,感激不尽,拜谢. 领扣 第2题 今日算法 题干 //给定一个字符串,请你找出其中不含有重复字符的 最长子串 ...

  8. 【LeetCode】无重复字符串最长子串

    题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "a ...

  9. LeetCode(3):无重复字符的最大子串

    本内容是LeetCode第三道题目:无重复字符的最大子串 # -*- coding: utf-8 -*- """ Created on Sun Mar 10 20:14: ...

随机推荐

  1. Java注解原理

    1. @interface不是接口是注解类,使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节 2. @in ...

  2. 写一函数,用来求表达式1+2+3+.....+n的值,并编写主函数

    Description 写一函数,用来求表达式1+2+3+.....+n的值,并编写主函数.n由键盘输入. Input 输入一个整数 Output 输出表达式的值 Sample Input 5 Sam ...

  3. ABP之多租户

    “软件多租户”指的是一种软件架构,一个软件实例在一个服务器上运行,但为多个租户服务.租户们对软件实例有通用的访问入口,但是每个租户都有特定的权限. 在多租户体系架构中,用程序旨在为每个租户提供一个专用 ...

  4. bboss oreach循环嵌套遍历map

    foreach循环嵌套遍历mapforeach嵌套dsl脚本定义 <property name="dynamicInnerDsl"> <![CDATA[{ ## ...

  5. 【刷题】牛客网看到的鹅厂ML面筋-部分问题RecSys相关

    昨天下午六点半的电话面试,其实我已经有了一个不错的实习offer ,不是特别想去腾讯了,没有太怎么准备,接的电话. 整个面试15分钟,开始就是自我介绍,接着问项目,和上一段百度实习经历.问题大致如下: ...

  6. js全角字符转为半角字符

    //全角转半角 function CtoH(str){ var result=""; for (var i = 0; i < str.length; i++){ if (st ...

  7. 三、Redis基础操作

    前言: Redi是key-value的NoSQL,我们用Redis提供的redis-cli就能操作String类型key和各种数据类型value.但是放入的不是特定类型数据,添加的都是一个一个Stri ...

  8. 项目中写到看到的一些LINQ和Lambda语句

    1,求和 var datas = SellOutActualData.Where(b => b.BrandCode == brandExportParam.BrandInfo.BrandCode ...

  9. log4j到log4j2升级迁移方案

    序:这段时间因为维护的项目存在大量日志打印,严重拖慢整体响应时间,在做性能优化的工作中对这块内容进行了升级换代,由以前的log4j升级为log4j2,以实现日志异步打印.接下来记录一下这个费时半个月的 ...

  10. Async/Await 学习与示例

    参考:Async/await学习 es 7 提供了对 promise 对象的更好的操作,省去了很多丧心病狂的链式异步请求,promise 是回调地狱的福音,而 Async/Await 则是 promi ...