博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PermutationsUnique,求全排列,去重
阅读量:5135 次
发布时间:2019-06-13

本文共 2118 字,大约阅读时间需要 7 分钟。

问题描述:给定一个数组,数组里面有重复元素,求全排列。

算法分析:和上一道题一样,只不过要去重。

3 import java.util.ArrayList; 4 import java.util.HashSet; 5 import java.util.List; 6 import java.util.Set; 7  8 public class PermutationsUnique { 9     public ArrayList
> permuteUnique(int[] num) {10 ArrayList
> result = new ArrayList
>();11 permuteUnique(num, 0, result);12 return result;13 }14 15 private void permuteUnique(int[] num, int start, ArrayList
> result) {16 17 if (start >= num.length ) {18 ArrayList
item = convertArrayToList(num);19 result.add(item);20 }21 22 for (int j = start; j < num.length; j++) {23 if (containsDuplicate(num, start, j)) {24 swap(num, start, j);25 permuteUnique(num, start + 1, result);26 swap(num, start, j);27 }28 }29 }30 31 private ArrayList
convertArrayToList(int[] num) {32 ArrayList
item = new ArrayList
();33 for (int h = 0; h < num.length; h++) {34 item.add(num[h]);35 }36 return item;37 }38 //nums[start]和nums[end]交换,如果start-end之间有nums[i]==nums[end],那说明它以前交换过,就不用重复了。39 private boolean containsDuplicate(int[] arr, int start, int end) {40 for (int i = start; i < end; i++) {41 if (arr[i] == arr[end]) {42 return false;43 }44 }45 return true;46 }47 48 private void swap(int[] a, int i, int j) {49 int temp = a[i];50 a[i] = a[j];51 a[j] = temp;52 }53 54 55 56 57 //这种方法和Permutation一样,因为用set了,所以就已经去重了。58 public static List
> permuteUnique2(int[] num) {59 List
> returnList = new ArrayList<>();60 returnList.add(new ArrayList
());61 62 for (int i = 0; i < num.length; i++) {63 Set
> currentSet = new HashSet<>();64 for (List
l : returnList) {65 for (int j = 0; j < l.size() + 1; j++) {66 l.add(j, num[i]);67 ArrayList
T = new ArrayList
(l);68 l.remove(j);69 currentSet.add(T);70 }71 }72 returnList = new ArrayList<>(currentSet);73 }74 75 return returnList;76 }77 78 public static void main(String[] args)79 {80 Permutations pt = new Permutations();81 int[] num = {1,2,1,3};82 System.out.println(pt.permute(num).size());83 System.out.println(pt.permute(num));84 }85 }

 

转载于:https://www.cnblogs.com/masterlibin/p/5564958.html

你可能感兴趣的文章
表格测试
查看>>
Android 命名规范 (提高代码可以读性) 转
查看>>
移动设备尺寸规范汇总(转)
查看>>
Oracle 创建用户,表空间
查看>>
map set区别
查看>>
Mysql
查看>>
面向对象-面向对象和面向过程的区别
查看>>
数组Array的一些方法
查看>>
window10设置文件的默认打开方式
查看>>
SQLiteOpenHelper 升级onUpgrade 的调用问题
查看>>
android Firebase中配置 Crashlytics
查看>>
典型的阻容降压电路
查看>>
SQL数据库数据类型详解
查看>>
MVC 服务器文件下载
查看>>
CodeForces 484B 数学 Maximum Value
查看>>
『编程题全队』Beta 阶段冲刺博客五
查看>>
Oracle----SQL语句积累 (Oracle 导入 dmp文件)
查看>>
js分割字符串
查看>>
pku1365 Prime Land (数论,合数分解模板)
查看>>
python之__init__.py文件
查看>>