全排列问题Ⅱ(Java实现)

题目:

给定一个可包含重复数字的序列,返回所有不重复的全排列。

示例:

输入: [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();
        }
    }
}
 
原文地址:https://www.cnblogs.com/youdiaodaxue16/p/10738319.html