47. 全排列 II
难度中等
给定一个可包含重复数字的序列 nums
,按任意顺序 返回所有不重复的全排列。
emmm上一篇还在说数组标记法不好用,这一篇就打脸了,这里不能使用数组交换法,因为交换导致判断是否重复这一环节会出问题,目前还没想到解决办法,所以乖乖用数组标记法啦,先对nums进行排序,方便后面判断是否用过,好难理解,但还是勉强扒拉出来了
上代码
class Solution {
public:
vector<int> path;
vector<vector<int>> res;
int flag[8];
void swap(int &a,int &b){
int t;
t=a;
a=b;
b=t;
}
void dfs(vector<int>& nums,int i,int len){
if(i==len){
res.push_back(path);
return ;
}
for(int j=0;j<len;j++){
if(flag[j])
continue;
if(!flag[j] && j>0 && nums[j]==nums[j-1] && flag[j-1])
continue;
flag[j]=1;
path.push_back(nums[j]);
dfs(nums,i+1,len);
flag[j]=0;
path.pop_back();
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
int len=nums.size();
sort(nums.begin(),nums.end());
if(!len){
return res;
}
dfs(nums,0,len);
return res;
}
};
结果:
2023年7月22日,我刷了三道题,怎么这么难哇,似理解非理解的,快卒了,洗洗睡😭😭😭
本宫睡不着,看了评论区,鲜红的“云贵人虽愚蠢,却实在美丽”,不是交换法不行啊,是我无能啊,我copy了一下别人的代码,记录在这以后慢慢消化。
太难受了,真的不看了,while(true)cout<<"😭";