46(47). Permutations
2017-07-30 16:33
113 查看
Given a collection of distinct numbers,
return all possible permutations.
求无重复元素集合的全排列。这是一道比较经典的题目,面试过程中碰到的次数也比较多。
我们的第一想法就是使用递归求解,假设我们要求n个元素的全排列,我们可以先从这n个元素中循环取出其中1个元素,然后只需要求剩下的n-1个元素的全排列即可,……,如此递归下去,直到集合中只剩一个元素,它的全排列就是本身。
下面贴代码:
接下来的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;
}
}
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;
}
}
相关文章推荐
- [LeetCode 46 & 47] Permutations I & II
- 46 permutations && 47 Permutation II
- Leetcode 46/47 Permutations, Permutations II
- leetcode46/47-Permutations I/II(全排列问题)
- LeetCode 46/47. Permutations i, ii
- LeetCode46,47 Permutations, Permutations II
- leetcode-46、47 Permutations/II 数字的排列组合
- LeetCode 46 Permutations + LeetCode 47 Permutations II
- 46、47-Permutations
- [Leetcode] 46, 47, 77
- linux命令学习(46 47)-last lastlog
- 47. Permutations II LeetCode
- leetcode 46,47. Permutations I/II 全排列问题 java
- LeetCode 46 Permutations
- 46, 47 Permutations I, II
- LeetCode 数字排列问题 46 Permutations
- LeetCode-46-Permutations 暴力递归
- leetcode_permutaionu全排列集合_31_46_47_60
- 46 进制与位运算(上)47 进制与位运算(下)
- Leetcode 46 Permutations