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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值