Permutations I
先上题目
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
代码部分
class Solution {
List<List<Integer>> result = new ArrayList<List<Integer>>();
public List<List<Integer>> permute(int[] nums) {
if(nums ==null)return result;
int len = nums.length;
sortNums(nums, 0, len);
return result;
}
public void sortNums(int[] nums, int n, int len){
List<Integer> list = new ArrayList();
if(len-1 ==n){
for(int i =0; i <len; i++){
list.add(nums[i]);
}
result.add(list);
return;
}
for(int j =n; j <len; j++){
swap(nums,n,j);
sortNums(nums,n+1,len);
swap(nums,n,j); //不还原,for不同次的循环使用的nums不同
}
}
public void swap(int[] nums, int n, int j){
int temp = 0;
temp = nums[n];
nums[n] = nums[j];
nums[j] = temp;
}
}
Permutations II
先上题目
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ]
代码部分
class Solution {
List<List<Integer>> result = new ArrayList<List<Integer>>();
public List<List<Integer>> permuteUnique(int[] nums) {
List<Integer> list = new ArrayList();
int len = nums.length;
if(len==0 || nums==null){
result.add(list);
return result;
}
boolean[] index = new boolean[len];
Arrays.sort(nums);
sortNums(nums, list, index);
return result;
}
public void sortNums(int[] nums, List<Integer> list, boolean[] index){
if(list.size() == nums.length){
result.add(new ArrayList<Integer>(list));
return ;
}
for(int i=0; i<nums.length; i++){
if(index[i])continue;
if(i!=0 && nums[i]==nums[i-1] && !index[i-1])continue;
list.add(nums[i]);
index[i]=true;
sortNums(nums, list, index);
list.remove(list.size()-1);
index[i] = false;
}
}
}