首页 > 其他分享 >全排列

全排列

时间:2023-05-30 17:06:57浏览次数:37  
标签:排列 int void len vis Permutation


生成全排列的三种方法

该函数生成全排列时需要注意原数组本身需要排好序,并且没有重复元素,否则生成的结果会有重复。

void Permutation(int k,int a[],int len){
	if(k==len){
		for(int i=0;i<len;i++){
			cout<<a[i]<<' ';
		}
		cout<<endl;
		return;
	}
	for(int i=k;i<len;i++){
		swap(a[i],a[k]);
		Permutation(k+1,a,len);
		swap(a[i],a[k]);
	}
}

该法可以生成即使数组中有重复元素也仍然可以让结果不重复的全排列

void _Permutation(int k,int a[],int len,bool vis[],int path[])
{
	if(k==len)
	{
		for(int i=0; i<len; i++)
		{
			cout<<path[i]<<' ';
		}
		cout<<endl;
		return;
	}
	for(int i=0; i<len; i++)
	{
		if(i>0&&a[i-1]==a[i]&&!vis[i-1])continue;
		if(!vis[i])
		{
			vis[i]=true;
			path[k]=a[i];
			_Permutation(k+1,a,len,vis,path);
			vis[i]=false;
		}
	}
}

在c++中,在头文件下有全排列函数next_perputation()所以可以直接通过该函数生成去除重复元素的全排列。

void Permutation_2(int a[],int len)
{
	do
	{
		for(int i=0; i<len; i++)
		{
			cout<<a[i]<<' ';
		}
		cout<<endl;
	}while(next_permutation(a,a+len)); 
}


标签:排列,int,void,len,vis,Permutation
From: https://blog.51cto.com/u_16144724/6380458

相关文章

  • 排列组合的实现Cmn,Amn
    递归方法:publicclassCombination{/***计算从m个元素中选n个元素的组合数Cmn*@paramm总共有m个元素*@paramn从中选n个元素*@return组合数Cmn的值*/publicstaticintCmn(intm,intn){if(n==0||n==m){......
  • 2023-05-22:给定一个长度为 n 的字符串 s ,其中 s[i] 是: D 意味着减少; I 意味着增加。
    2023-05-22:给定一个长度为n的字符串s,其中s[i]是:D意味着减少;I意味着增加。有效排列是对有n+1个在[0,n]范围内的整数的一个排列perm,使得对所有的i:如果s[i]=='D',那么perm[i]>perm[i+1],以及;如果s[i]=='I',那么perm[i]<perm[i+1]。返回有效排列......
  • 集合排列、分割
    目录1.全排列(去重)2.子集3.集合分割1.全排列(去重)voiddfs(constvector<int>&nums,intpos,vector<vector<int>>&result,vector<int>&cur){if(pos==nums.size()){result.push_back(cur);return;}for......
  • 标准库中的生成器函数——用于重新排列元素的生成器函数
         1注意,itertools.groupby假定输入的可迭代对象要使用分组标准排序;即使不排序,至少也要使用指定的标准分组各个元素。  1#itertools.groupby函数的用法2importitertools3456k1=list(itertools.groupby('LLLLAAGGG'))7print('k1:',k......
  • 全排列去重
    全排列去重的前提要求是目标集合必须是经过排序的。在目标集合排序的前提下,第i位变换数字前后,如果是相同的数字,就会产生重复的排列。注意:第i位变换的意思是i位本身的变换,而不是i与i-1的比较。题目链接代码如下:voiddfs(constvector<int>&nums,intpos,vector<vector<int>......
  • 2023-05-16:给你一个 严格升序排列 的正整数数组 arr 和一个整数 k 。 请你找到这个数
    2023-05-16:给你一个严格升序排列的正整数数组arr和一个整数k。请你找到这个数组里第k个缺失的正整数。输入:arr=[2,3,4,7,11],k=5。输出:9。答案2023-05-16:大体步骤如下:1.初始化左指针l为0,右指针r为数组长度减一,定义中间指针m和find(找到第k个正整数前的下标位置),......
  • sql---排列函数
    rank()&&dense_rank()1.rank()排名按照1,2,2,4,5,6selectscore,rank()over(orderbyS.scoredesc)as"rank"fromScoresS2.dense_rank()排名按照1,2,2,3,4,5selectscore,dense_rank()over(orderbyS.scoredesc)as"rank"fromScores......
  • 全排列
    字典序(非指针):#include<stdio.h>#include<string.h>#defineN100chara[N];voidswap(inti,intj){//交换 charch;ch=a[i];a[i]=a[j];a[j]=ch;}voidreverse(intstart,intend){//逆置 while(start<end){ swap(start,end);start++;......
  • P4163 [SCOI2007]排列
    Problem给一个数字串\(s\)和正整数\(d\),统计\(s\)有多少种不同的排列能被\(d\)整除(可以有前导\(0\))。多组数据。\(\left\verts\right\vert\le10,1\led\le1000,1\let\le15\)Input第一行一个整数\(t\),表示数据组数。接下来\(t\)行,每行一个数字串\(s\)......
  • shell排列3个整数
    用户输入3个整数,脚本根据数字大小依次升序输出3个数字#!/bin/bashecho"Pleaseenterthreeintegers:"read-rnum1num2num3echo"Sortedintegersinascendingorder:"echo"$num1$num2$num3"|tr'''\n'|sort-n|tr'\......