基础算法-全排列
2017-02-24 17:13
169 查看
无去重全排列
对于某个元素作为开头的序列,如果知道了它右边的元素的全排列,就知道了以它开头的全排列如果序列后面的元素都跟第一个元素交换位置,就知道了每个元素开头的全排列,也就知道了整个序列的全排列。
public static void permutation1(int a[],int k,int n){ if(k>=n){ for(int i=0;i<n;i++) System.out.print(a[i]+" "); System.out.println(); }else{ for(int i=k;i<n;i++){ swap(a,k,i); permutation1(a,k+1,n); swap(a,k,i); } } }
这个对于任意元素都唯一的序列来说没有什么问题,但是如果有重复元素,可能产生重复的排列。比如 1,2,2
1 跟第一个 2 交换 : 2,1,2
1 跟第二个 2 交换 : 2,1,2
去重全排列
可以考虑这样来去重,每次交换 i,j 的元素的时候,必须要在 [i,j) 的区间内没有元素与 a[j] 相同。也就是重复元素只能交换到第一个位置一次。
这样 :
1,2,2
1 跟第一个 2 交换 : 2,1,2
对于 [1,2] 序列 有 2,2,1
public static boolean hasJ(int a[],int i,int j){ for(int k=i;k<j;k++){ if(a[k]==a[j]) return true; } return false; } public static void permutation2(int a[],int k,int n){ if(k>=n){ for(int i=0;i<n;i++) System.out.print(a[i]+" "); System.out.println(); }else{ for(int i=k;i<n;i++){ if(!hasJ(a,k,i)){ swap(a,k,i); permutation2(a,k+1,n); swap(a,k,i); } } } }
相关文章推荐
- 基础算法----全排列
- JAVA代码—算法基础:找出字符串的所有排列
- java 入门程序至排列选择算法---基础入门
- 【基础算法】- 全排列
- 算法竞赛一些基础问题的复习(java) 1(大水仙花数、韩信点兵、倒三角、排列)
- 【基础算法】有重复元素的全排列问题
- 基础算法之排列组合生成算法
- 基础算法之排列组合生成算法
- 基础算法(二分,去重,排列)
- 【算法基础】排列与组合
- C++15道基础算法题---(2)排列组合
- 算法基础:排列组合问题-全排列(Golang实现)
- 干货 | 程序员必须知道的十大基础实用算法及其讲解
- 算法之排列与组合算法
- 每天一道算法题——求全排列
- 我理解的剑指offer----字符串的全排列和组合算法
- poj1222(开关灯来自(程序设计与算法(二)算法基础mooc))
- java基础算法50题
- 基础算法——递归——xyoj 1353半数单集问题
- 【基础算法】(07)五大常用算法之三:贪心算法