题解 | #有重复项数字的全排列,TreeSet去重排序#
有重复项数字的全排列
http://www.nowcoder.com/practice/a43a2b986ef34843ac4fdd9159b69863
import java.util.*; public class Solution { public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) { //定义一个TreeSet,指定排序规则(字典序规则) TreeSet<ArrayList<Integer>> set = new TreeSet<>(new Comparator<ArrayList<Integer>>() { public int compare(ArrayList<Integer> arr1 , ArrayList<Integer> arr2) { for(int i = 0 ; i < arr1.size() ; i ++) { if(arr1.get(i) > arr2.get(i)) { return 1 ; } else if (arr1.get(i) < arr2.get(i)) { return -1 ; } } return 0 ; } }) ; help(num , 0 , new ArrayList<>() , set) ; ArrayList<ArrayList<Integer>> res = new ArrayList<>(set) ; return res ; } /* 得到arr[start]及其之后所有元素的全排列,并将结果保存到res中 其中tmp保存的是当前arr[start]的值 */ public void help(int []arr , int start , ArrayList<Integer> tmp,TreeSet<ArrayList<Integer>> res) { if(start == arr.length) { ArrayList<Integer> r = new ArrayList<>(tmp) ; res.add(r) ; return ; } for(int j = start ; j < arr.length ; j ++) {//这个位置之后的元素,都可能出现在这个位置 swap(arr , start , j) ;//和j位置元素交换 tmp.add(arr[start]) ;//保存新的arr[start] help(arr , start + 1 , tmp , res) ;//求这个start之后的元素的全排列 swap(arr , start , j) ;//递归返回后恢复现场 tmp.remove(tmp.size()-1) ;//移除当前元素,恢复现场 } } //交换元素 public void swap(int num[] , int i , int j) { int t = num[i] ; num[i] = num[j] ; num[j] = t ; } }
一个菜鸟的算法刷题记录 文章被收录于专栏
分享一个菜鸟的成长记录