全排列递归算法(元素有重复与无重复,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: ...
随机推荐
- wordpress如何利用插件添加优酷土豆等视频到自己的博客上
wordpress有时候需要添加优酷.土豆等网站的视频到自己的博客上,传统的分享方法不能符合电脑端和手机端屏幕大小的需求,又比较繁琐,怎样利用插件的方法进行添加呢,本视频向你介绍一款这样的插件——Sm ...
- RocketMQ知识整理与总结
1.架构 RocketMQ的master broker与master broker没有任何消息通讯,nameserver之间也同样没有消息通信 MQ历史 由数据结构队列发展而来 MQ使用场景 异 ...
- eclipse导入maven项目,但无法编译的问题
同事今天从git 导入项目到eclipse 后,发现项目所依赖的包找不到依赖,初步判定是maven的依赖没有导入项目中. 最终发现,在项目中的.classpath 文件加入以下代码即可解决问题. &l ...
- P4013 数字梯形问题 网络流
题目描述 给定一个由 nn 行数字组成的数字梯形如下图所示. 梯形的第一行有 mm 个数字.从梯形的顶部的 mm 个数字开始,在每个数字处可以沿左下或右下方向移动,形成一条从梯形的顶至底的路径. 分别 ...
- maven笔记学习
一.修改setting.xml文件中的镜像 在导入他人项目或者在导入项目时,我们会出现在项目中不能识别maven配置的库文件的情况那么我们可以重新下载本地库, 首先我们可以修改我们安装的maven环境 ...
- 脚本安装Rocky版OpenStack 1控制节点+1计算节点环境部署
视频安装指南请访问: http://39.96.203.138/wordpress/document/%E8%84%9A%E6%9C%AC%E5%AE%89%E8%A3%85rocky%E7%89%8 ...
- LVS调度算法
LVS-四层调度 1.轮询算法:Round Robin - RR 后端RS性能一致,请求开销差别小 2.加权轮询:Weighted Round Robin - WRR 后端RS性能有差异,请求开销差异 ...
- 数据的存储方式:SQLiteOpenHelper的用法
Android为了让我们能够更加方便的的管理数据,专门提供了一个SQLiteOpenHelper类,它是一个抽象类,如果我们想要使用它,就需要创建一个自己帮助类去继承它,而且它有两个抽象的方法,分别是 ...
- python监控机器(第1版)
# coding:utf-8 import configparser import logging import os import psutil import ctypes import platf ...
- nginx 项目部署
一.nginx 想必我们大多数人都是通过访问网站而开始接触互联网的吧.我们平时访问的网站服务 就是 Web 网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务. Web 网络服务是一种被 ...