46(47). Permutations

Given a collection of distinct numbers, return all possible permutations.

求无重复元素集合的全排列。这是一道比较经典的题目,面试过程中碰到的次数也比较多。

我们的第一想法就是使用递归求解,假设我们要求n个元素的全排列,我们可以先从这n个元素中循环取出其中1个元素,然后只需要求剩下的n-1个元素的全排列即可,……,如此递归下去,直到集合中只剩一个元素,它的全排列就是本身。

下面贴代码:

public class Solution {
    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> list = new ArrayList<>();
        List<Integer> list1 = new ArrayList<>();
        if(nums.length == 0)
            return list;
        if(nums.length == 1){      
            list1.add(nums[0]);
            list.add(list1);
            return list;
        }
        for(int i=0;i<nums.length;i++){            //循环取出数组中的每一个元素
            int[] nums1  = new int[nums.length-1];
            int k = 0;
            for(int j=0;j<nums.length;j++){     //定义n-1个元素的数组
                if(j != i)
                nums1[k++] = nums[j];
            }
            List<List<Integer>> l = permute(nums1);    //递归得到n-1个元素的全排列
            for(List<Integer> l1 : l){       //将之前取出的元素插入每个全排列的末尾
                l1.add(nums[i]);
            }
            list.addAll(l);
        }
        return list;
    }
}


接下来的47题就是给定的数组中有重复元素的情况下,我们如何求出全排列,很简单,我们只要加一个判断条件即可,观察代码:

public class Solution {
    public List<List<Integer>> permuteUnique(int[] nums) {
        List<List<Integer>> list = new ArrayList<>();
        List<Integer> list1 = new ArrayList<>();
        if(nums.length == 0)
            return list;
        if(nums.length == 1){
            list1.add(nums[0]);
            list.add(list1);
            return list;
        }
        ArrayList<Integer> al = new ArrayList<>();     //定义一个list用来存放已经取过的元素。
        for(int i=0;i<nums.length;i++){
            if(!al.contains(nums[i])){              如果元素已经在list中了,即表示该元素为重复元素,不需要再排列了。
                al.add(nums[i]);
                 int[] nums1  = new int[nums.length-1];
            int k = 0;
            for(int j=0;j<nums.length;j++){
                if(j != i)
                nums1[k++] = nums[j];
            }
            List<List<Integer>> l = permuteUnique(nums1);
            for(List<Integer> l1 : l){
                l1.add(nums[i]);
            }
            list.addAll(l);
            }
           
        }
        return list;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值