给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [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>>res=new ArrayList<List<Integer>>();
public List<List<Integer>> permute(int[] nums) {
for(int i=0;i<nums.length;i++){
add_to_list(nums, new ArrayList<>(), i, new HashSet<>());
}
return res;
}
void add_to_list(int[]nums,ArrayList<Integer>cur_list,int added_to_list,HashSet<Integer>hashSet){
cur_list.add(nums[added_to_list]);
hashSet.add(nums[added_to_list]);
if(hashSet.size()<nums.length){
for(int i=0;i<nums.length;i++){
if(!hashSet.contains(nums[i])){
add_to_list(nums,new ArrayList<>(cur_list),i,new HashSet<>(hashSet));
}
}
}
else {
res.add(cur_list);
}
}
}
思路:依次遍历每一位, 对于cur_pos上的值可以有 与剩余位置交换和 不交换两种操作
比如:1 2 3
首先 cur pos 上的元素为1,
那么处理后的数组 有1 2 3 2 1 3 3 2 1
然后对于1 2 3 处理 下标为1(num[1]也就是2)的元素
可以得到 1 2 3(不交换)、1 3 2
class Solution {
List<List<Integer>>res=new ArrayList<List<Integer>>();
public List<List<Integer>> permute(int[] nums) {
if (nums == null || nums.length == 0) {
return res;
}
if (nums.length == 1) {
ArrayList<Integer> list = new ArrayList<>();
list.add(nums[0]);
res.add(list);
return res;
}
res.add(to_list(nums));
swap_cur(nums,0);
return res;
}
void swap_cur(int[]nums,int cur_pos){
if(cur_pos<nums.length){
swap_cur(nums,cur_pos+1);
}
for(int next_pos=cur_pos+1;next_pos<nums.length;next_pos++){
//进行了交换
int tmp=nums[cur_pos];
nums[cur_pos]=nums[next_pos];
nums[next_pos]=tmp;
res.add(to_list(nums));
swap_cur(nums,cur_pos+1);
nums[next_pos]=nums[cur_pos];
nums[cur_pos]=tmp;
}
}
ArrayList<Integer> to_list(int[]nums){
ArrayList<Integer>cur_list=new ArrayList<>();
for(int i=0;i<nums.length;i++){
cur_list.add(nums[i]);
}
return cur_list;
}
}