题目:
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
这个问题和我的上一篇问题分析的手法一样,只是多加了“去重”的操作,对于全排列问题没理解的请看上一篇全排列问题Ⅰ(Java实现)博客。
对于“去重”我有几点说明:
1.我们可以通过判断List来解决:
代码如下:
package edu.ymm.about_permutation; import java.util.ArrayList; import java.util.List; public class per3 { public static List<List<Integer>> permute(int[] nums) { List<List<Integer>> lists=new ArrayList<>(); if(nums.length==0||nums==null){ return lists; } permute(lists,nums,new ArrayList<>(),0); return lists; } private static void permute(List<List<Integer>> lists,int[] nums, List<Integer> list, int index) { //边界值判断 if(index==nums.length){ for(int i = 0;i < nums.length;i++) { list.add(nums[i]); } if(!lists.contains(list)) { //去重 lists.add(new ArrayList<>(list)); } list.clear(); }else { for(int i=index;i<nums.length;i++){ swap(nums,index,i); //第一次交换定点之后的 permute(lists,nums,list,index+1); //进行递归 swap(nums,index,i); //这是交换定点的,也就是重新返回上一级进行交换 } } } private static void swap(int[] nums, int index, int i) { int t =nums[index]; nums[index] = nums[i]; nums[i] = t; } public static void main(String[] args){ int[] nums=new int[]{1,1,3}; List<List<Integer>> lis=new ArrayList<>(); lis=permute(nums); for(List<Integer> list:lis){ for(int i:list){ System.out.print(i+" "); } System.out.println(); } } }