`
viking.liu
  • 浏览: 53923 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

有重复数的全排列

阅读更多
有重复数的全排列和全排列的算法是一样的
只不过要去掉重复的序列
122的全排列
122
212
221
一共三种
三个数的全排列是6种,其中有3种重复了。
其实关键问题就是怎么从全排列中去掉重复的

理解全排序的过程,从begin到i-1的数据都与begin交换过,
如果第i的数据与前面begin到i-1中的数据有重复,那么不用交换了
设 a[i]=x 存在 a[j]=x , begin<=j<=i-1
根据 全排列的递归公式知道 Perm(Ri)=Perm(Rj)
所以 Perm(Ri)为重复的需要去掉

package com.viking.divide;

public class DuplicatePerm {

	public static void main(String[] args) {
		int[] a = { 1, 2, 2,3,3};
		System.out.println(perm(a, 0));
	}

	public static int perm(int[] a, int begin) {
		if (begin == a.length) {
			for (int i = 0; i < a.length; i++) {
				System.out.print(a[i] + " ");
			}
			System.out.println();
			return 1;
		}

		int count = 0;
		for (int i = begin; i < a.length; i++) {
			if(isSwap(a,begin,i)){
				swap(a, begin, i);
				count += perm(a, begin + 1);
				swap(a, begin, i);
			}			
		}
		return count;
	}

	public static void swap(int[] a, int begin, int end) {
		int temp = a[begin];
		a[begin] = a[end];
		a[end] = temp;
	}
	
	public static boolean isSwap(int[] a,int begin,int end){		
		for(int i=end;i>begin;i--){
			if(a[end]==a[i-1]){
				return false;
			}
		}
		return true;	
	}

}
分享到:
评论

相关推荐

    C语言重复数全排列的代码

    生成这些字符的不重复的全排列,并将结果打印到标准输出上。 【输入形式】 从标准输入上读入一个由字母、数字组成的字符串,字符串的长度小于100,其中包含重复的字符。 【输出形式】 向标准输出印...

    有重复数字的全排列代码

    算法分析课程作业,C语言编写,可能需要用input.txt输入,有重复数字的全排列代码

    C#实现解决全排列重复问题

    当输入元素中存在重复时,处理全排列问题会变得更为复杂。C#作为.NET框架下的主要编程语言,提供了丰富的数据结构和算法支持来解决这类问题。本篇文章将深入探讨如何使用C#解决全排列重复问题,并提供一种有效的实现...

    输出n个数字的全排列(可重复)

    3、输入n个数(有重复),求n个数字的全排列 如:n=3 全排列的数字为1 1 2 则输出 112 121 211 4、输入n和k(n》=k) 求n个数字的(n,k)排列 如:n=3 k=2 排列的数字为1 1 2 则输出 11 12 21

    全排列的算法(有重复数据)

    n个有重复元素全排列:无重复的全排列为序列头元素与所有元素进行交换共n种情况,每种情况的后n-1位元素构成新的序列。 重复以上过程。因为有重复元素,想要序列不重复:(1)需要保证序列头元素与其余元素一次交换...

    使用swap函数求解带有重复字符串的全排列

    这样我们也得到了在全排列中去掉重复的规则——去重的全排列就是从第一个数字起每个数分别与它后面非重复出现的数字交换。用编程的话描述就是第i个数与第j个数交换时,要求[i,j)中没有与第j个数相等的数。下面给出...

    五个数的全排列

    以下是C语言实现5个数全排列的基本步骤: 1. 定义一个数组,存储5个待排列的数。 2. 编写一个递归函数,接收当前已排列的子数组和未排列的子数组作为参数。 3. 在递归函数中,如果未排列的子数组为空,说明所有排列...

    N个数全排列的非递归算法

    标题 "N个数全排列的非递归算法" 涉及的是计算机科学中的经典问题——全排列。全排列是指从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列的所有可能组合。在这个场景中,非递归算法指的是不依赖递归...

    回溯法 - 输出自然数1到n所有不重复的排列,即n的全排列

    根据给定文件的信息,本文将深入探讨如何使用回溯法来输出自然数1到n的所有不重复排列(即n的全排列)。同时,还将提供一个Java实现的具体示例。 ### 回溯法简介 回溯法是一种通过尝试解决离散和组合问题的方法,...

    使用swap求解不重复字符串的全排列

    123的全排列有123、132、213、231、312、321这六种。首先考虑213和321这二个数是如何得出的。显然这二个都是123中的1与后面两数交换得到的。然后可以将123的第二个数和每三个数交换得到132。同理可以根据213和321来...

    易语言源码易语言数字文本的全排列.rar

    例如,对于数字1、2、3,其全排列有123、132、213、231、312、321这六种组合。 在易语言中,实现全排列通常会用到递归或回溯法。递归是一种函数调用自身的技术,而回溯法则是一种在搜索解空间树的过程中,通过不断...

    去重全排列的递归实现

    去重全排列的递归实现 去掉重复数字的 全排列的 递归实现

    全排列数生成

    各行上的全排列不重复。输出各行遵循“小数优先”原则, 在各全排列中,较小的数尽量靠前输出。如果将每行上的输出看成一个数字,则所有输出构成升序数列。具体格式见输出样例。 【样例输入1】1 【样例输出1】1 ...

    局部搜索解决全排列问题

    总结,局部搜索在全排列问题中的应用主要体现在使用递归策略生成排列,但这种方法对于大规模问题效率低下,且处理重复元素时存在问题。对于矩阵最小值问题,全排列提供了所有可能的组合,但计算量随矩阵大小呈指数级...

    易语言数字文本的全排列

    在编程领域,全排列是一种常见的算法问题,它涉及到对一组数据进行所有可能的无重复、无顺序的排列。在这个特定的场景中,我们关注的是如何使用易语言来实现数字文本的全排列。易语言是中国本土开发的一种编程语言,...

    全排列算法解析(完整版)

    全排列的数量可以通过排列数公式n!(n的阶乘)来计算。全排列算法广泛应用于程序设计中,尤其是在需要穷举所有可能性的场合,比如组合数学、游戏设计、密码学等领域。 在C或C++中实现全排列算法,主要的思想是递归...

    一种计算全排列的简易算法

    全排列算法通常有多种实现方式,例如深度优先搜索(DFS)、回溯法、栈或者队列等。这种简易算法可能是通过递归或迭代的方式来完成的,它可能避免了复杂的递归结构,使得理解和实现更为简单。 描述中提到“尚有待...

    用回溯法求序列的全排列

    回溯法的优点在于可以避免重复计算,只需要在每个分支上尝试所有可能的选择,直到找到解决方案或者确定无解。缺点是效率通常低于动态规划等其他算法,因为它可能涉及到大量的回溯操作。然而,对于小规模的问题,如本...

    全排列的生成算法

    全排列的生成算法是指对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来。任何 n 个字符集的排列都可以与 1~n 的 n 个数字的排列一一对应,因此在此就以 n 个数字的排列为例说明排列的生成...

Global site tag (gtag.js) - Google Analytics