permutations(排列)

题目1

给定数字的集合,返回所有可能的排列。
例如,
[1,2,3]有以下排列:
[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2]和[3,2,1]。

代码实现

/**
 *回溯法求数组的全排列
 */
import java.util.ArrayList;
public class Solution {
    public ArrayList<ArrayList<Integer>> permute(int[] num) {
        ArrayList<ArrayList<Integer>> result=new ArrayList<>();
        if(num==null || num.length==0) return result;
        ArrayList<Integer> list=new ArrayList<>();
        int n=num.length;
        boolean [] used=new boolean [n];
        permute(num,n,used,list,result);
        return result;
    }
    public void permute(int [] num,int n,boolean [] used,ArrayList<Integer> list,ArrayList<ArrayList<Integer>> result){
        if(n==0){
            ArrayList<Integer> temp=new ArrayList<>(list);
            result.add(temp);
        }else{
            for(int i=0;i<num.length;i++){
                if(!used[i]){
                    used[i]=true;
                    list.add(num[i]);
                    permute(num,n-1,used,list,result);
                    list.remove(list.size()-1);
                    used[i]=false;
                }
            }
        }
    }
}

题目2

给定可能包含重复项的数字集合,返回所有可能的唯一排列。
例如,
[1,1,2]有以下独特的排列组合:
[1,1,2],[1,2,1]和[2,1,1]。

代码实现

/**
 *回溯法求数组全排列(包括去重)
 */
import java.util.*;
public class Solution {
    public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
        ArrayList<ArrayList<Integer>> result=new ArrayList<>();
        if(num==null || num.length==0) return result;
        Arrays.sort(num);
        int n=num.length;
        ArrayList<Integer> list=new ArrayList<>();
        boolean [] used=new boolean [n];
        permuteUnique(num,n,used,list,result);
        return result;
    }
    public void permuteUnique(int [] num,int k,boolean [] used,ArrayList<Integer> list,ArrayList<ArrayList<Integer>> result){
        if(k==0){
            ArrayList<Integer> temp=new ArrayList<>();
            temp.addAll(list);
            result.add(temp);
        }else{
            for(int i=0;i<num.length;i++){
                if(!used[i]){
                    /**
                     *只需要判断i和i-1(而不需要判断i与i-2...) 相同的元素一定是相邻的。
                     *如果i-2,i-1,i相同,那么在上一轮循环就已经判断了i-1,i,本轮循环不需要重复判断
                     */
                    if(i>0 && num[i]==num[i-1] && !used[i-1])
                        continue;
                    used[i]=true;
                    list.add(num[i]);
                    permuteUnique(num,k-1,used,list,result);
                    list.remove(list.size()-1);
                    used[i]=false;
                }
            }
        }
    } 
}

题目1来自牛客网leetcode
题目2来自牛客网leetcode

猜你喜欢

转载自blog.csdn.net/everyfriday_shujk/article/details/80247309