标签:排列 全排列 uniq dfs 暴力 oid 技术 src 标记
题解:用一位数代替标记数组节省空间
class Solution {
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> permute(int[] nums) {
List<Integer> list = new ArrayList<>();
dfs(0,0,list,nums);
return res;
}
void dfs(int u,int state,List<Integer> list,int[] nums){
if(u == nums.length) {
res.add(new ArrayList(list));
return ;
}
for(int i=0;i<nums.length;i++){
if((state>>i&1)==0){//将state右移i位之后与1相与实际上就是看state的第i位是否为0
list.add(nums[i]);
dfs(u+1,state|(1<<i),list,nums);//将state的第i位置为1
list.remove(list.size()-1);
}
}
}
}
Set暴力去重
class Solution {
Set<List<Integer>> set = new HashSet<>();
public List<List<Integer>> permuteUnique(int[] nums) {
List<Integer> list = new ArrayList<>();
dfs(0,nums,list,0);
return new ArrayList<>(set);
}
void dfs(int u,int[] nums,List<Integer> list,int state){
if(u == nums.length){
set.add(new ArrayList(list));
return;
}
for(int i=0;i<nums.length;i++){
if((state>>i&1)==0){
list.add(nums[i]);
dfs(u+1,nums,list,state|(1<<i));
list.remove(list.size()-1);
}
}
}
}
标签:排列 全排列 uniq dfs 暴力 oid 技术 src 标记
原文地址:https://www.cnblogs.com/cstdio1/p/13362373.html