46. 全排列 - 力扣(LeetCode) (leetcode-cn.com) 47. 全排列 II - 力扣(LeetCode) (leetcode-cn.com)
1.全排列
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
输入: nums = [1,2,3]
输出: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
经典入门题了,有些公司让3分钟写出来。回溯思想,我这个删除的方式笨了一点,正常人的思路是写一个 int[] visited = new int[nums.length];做备忘录。
class Solution {
List<List<Integer>> res=new ArrayList<List<Integer>>();
List<Integer> list=new ArrayList<Integer>();
int len=0;
public List<List<Integer>> permute(int[] nums) {
len=nums.length;
getRes(nums,len);
return res;
}
public void getRes(int[] nums,int len){
if(list.size()==len){
res.add(new ArrayList<Integer>(list));
}
for(int i=0;i<nums.length;i++){
list.add(nums[i]);
getRes(remove(nums,nums[i]),len);
list.remove(list.size()-1);
}
}
public int[] remove(int[] arr,int target){
int[] arr_new = new int[arr.length-1];
for(int i=0, k=0;i<arr.length;i++){
if(arr[i]!=target){
arr_new[k]=arr[i];
k++;
}
}
return arr_new;
}
}
2.全排列II
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
输入: nums = [1,1,2]
输出:
[[1,1,2],
[1,2,1],
[2,1,1]]
同样是回溯思想,这次加个备忘录。
class Solution {
boolean[] vis;
List<List<Integer>> ans = new ArrayList<List<Integer>>();
List<Integer> perm = new ArrayList<Integer>();
public List<List<Integer>> permuteUnique(int[] nums) {
Arrays.sort(nums);
vis=new boolean[nums.length];
backtrack(nums,nums.length);
return ans;
}
public void backtrack(int[] nums, int len) {
if (perm.size()==len) {
ans.add(new ArrayList(perm));
return;
}
for (int i = 0; i < nums.length; ++i) {
if (vis[i] || (i > 0 && nums[i] == nums[i - 1] && !vis[i - 1])) {
continue;
}
perm.add(nums[i]);
vis[i] = true;
backtrack(nums,len);
vis[i] = false;
perm.remove(perm.size()-1);
}
}
}