全排列递归算法(元素有重复与无重复,C++实现)
元素无重复:
如: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++实现)的更多相关文章
- 从无重复大数组找TOP N元素的最优解说起
有一类面试题,既可以考察工程师算法.也可以兼顾实践应用.甚至创新思维,这些题目便是好的题目,有区分度表现为可以有一般解,也可以有最优解.最近就发现了一个这样的好题目,拿出来晒一晒. 1 题目 原文: ...
- hunnu 11313 无重复元素序列的最长公共子序列转化成最长递增子序列 求法及证明
题目:http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11313 湖师大的比赛,见我的另一篇水题题解,这里要说的 ...
- 算法练习之合并两个有序链表, 删除排序数组中的重复项,移除元素,实现strStr(),搜索插入位置,无重复字符的最长子串
最近在学习java,但是对于数据操作那部分还是不熟悉 因此决定找几个简单的算法写,用php和java分别实现 1.合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两 ...
- lintcode: 最长无重复字符的子串
题目 最长无重复字符的子串给定一个字符串,请找出其中无重复字符的最长子字符串. 例如,在"abcabcbb"中,其无重复字符的最长子字符串是"abc",其长度为 ...
- [LeetCode] 3. 无重复字符的最长子串
题目链接:(https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/) 题目描述: 给定一个字符 ...
- Set.js--创建无重复值的无序集合
Set 集合,不同于 Array,是一种没有重复值的集合. 以下代码出自于<JavaScript 权威指南(第六版)>P217,注意:这里并不是指 es6 / es2015 中的 Set ...
- day4——无重复字符的最长子串
// 小白一名,0算法基础,艰难尝试算法题中,若您发现本文中错误, 或有其他见解,往不吝赐教,感激不尽,拜谢. 领扣 第2题 今日算法 题干 //给定一个字符串,请你找出其中不含有重复字符的 最长子串 ...
- 【LeetCode】无重复字符串最长子串
题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "a ...
- LeetCode(3):无重复字符的最大子串
本内容是LeetCode第三道题目:无重复字符的最大子串 # -*- coding: utf-8 -*- """ Created on Sun Mar 10 20:14: ...
随机推荐
- robotFramework第二篇之关键字的定义和使用
lesson.robot *** Keywords *** 打开谷歌浏览器并访问百度首页 Log 打开浏览器,输入http://www.baidu.com,进入百度首页 输入用户名 [Argument ...
- Neuroph开发过程
文章提纲 安装与配置 开发小结 建立项目 配置项目 理解感知机的代码 安装与配置 JDK的安装:建议JRE 1.8以上: Neuroph安装:建议2.94的版本.下载地址 neuroph-core-2 ...
- 前端部署ant+yuicompressor文件压缩+获取版本+SSH公布(部分代码)
文件压缩: <apply executable="java" parallel="false" failonerror="true" ...
- App Inventor2项目部署到本地
介绍App Inventor App Inventor 原是Google实验室(Google Lab)的一个子计划,该项目是一个完全在线开发的Android编程环境,抛弃复杂的程式代码而使用积木式的堆 ...
- Python支付宝在线支付API
一.蚂蚁金服开发平台申请测试账号 a. 登陆蚂蚁金服开放平台https://open.alipay.com/platform/manageHome.htm,在“开发中心”—“研发服务”下拉处选择沙箱作 ...
- array数组(n,1)和(n,)互相转换
data.shape #(172,1) result = [arr[0] for arr in data] result.shape #(172,) (172,1)表示是一个(172,1)shape大 ...
- mongodb备份还原
备份:mongodump mongodump常用参数 --db:指定导出的数据库 --collection:指定导出的集合 --excludeCollection:指定不导出的集合 --host :远 ...
- MDS
转载:https://blog.csdn.net/victoriaw/article/details/78500894 多维缩放(Multidimensional Scaling, MDS)是一组对象 ...
- codeforces476D
Dreamoon and Sets CodeForces - 476D Dreamoon likes to play with sets, integers and . is defined as ...
- C#入门教程源码
C#入门教程源码 [日期:2019-01-26] 来源:51zxw.net 作者:zhangguofu [字体:大 中 小] 方法一:百度云盘下载地址: 链接:https://pan.baidu.c ...