您的位置:首页 > 其它

46(47). Permutations

2017-07-30 16:33 113 查看
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: