BM56. 有重复项数字的全排列
描述
示例1
输入:
[1,1,2]
输出:
[[1,1,2],[1,2,1],[2,1,1]]
示例2
输入:
[0,1]
输出:
[[0,1],[1,0]]
C++ 解法, 执行用时: 2ms, 内存消耗: 556KB, 提交时间: 2021-09-11
class Solution { public: void dfs(map<int,int>& m,vector<vector<int>>& ret, vector<int>& v,int n){ if(v.size()==n){ ret.push_back(v); } for(auto& i:m){ if(i.second>0){ i.second--; v.push_back(i.first); dfs(m,ret,v,n); v.pop_back(); i.second++; } } } vector<vector<int> > permuteUnique(vector<int> &num) { map<int,int> m; for(auto& i:num){ m[i]++; } vector<vector<int>> ret; vector<int> v; dfs(m,ret,v,num.size()); return ret; } };
C++ 解法, 执行用时: 2ms, 内存消耗: 560KB, 提交时间: 2021-09-11
// class Solution { // public: // vector<vector<int> > permuteUnique(vector<int> &num) { // } // }; class Solution { public: void backtrack(map<int, int> &m, vector<vector<int>> &ret, vector<int> &tmp, int n) { if (tmp.size() == n) { ret.push_back(tmp);//当最后生成的tmp长度等于n即可添加到最后结果中,n指的是输入数组长度, } for (auto &i:m) { if (i.second > 0) {//当i.second>0,表示有数字i.first可以被使用 i.second--;//使用一次数字i.first,i.second--; tmp .push_back(i.first);//加到生成的数组中 backtrack(m, ret, tmp, n);//下一步生成tmp tmp.pop_back(); i.second++;//上面回溯结束后,使用过的i.first拿出去,又可以被使用,因此tmp弹出最后一个元素,i.second++ } } } vector<vector<int> > permuteUnique(vector<int> &num) { map<int, int> m; for (auto& i : num) { m[i]++; } vector<vector<int>> ret; vector<int> tmp; backtrack(m, ret, tmp, num.size()); return ret; } };
C++ 解法, 执行用时: 3ms, 内存消耗: 412KB, 提交时间: 2021-10-12
class Solution { public: vector<vector<int> > permuteUnique(vector<int> &num) { vector<vector<int>> ans; sort(num.begin(), num.end()); ans.push_back(num); while (next_permutation(num.begin(), num.end())) { ans.push_back(num); } return ans; } };
C++ 解法, 执行用时: 3ms, 内存消耗: 412KB, 提交时间: 2021-09-30
class Solution { public: vector<vector<int> > permuteUnique(vector<int> &num) { vector<vector<int> > ret; if (num.size() == 0) return ret; for (int i : num) if (i >= 10) return ret; sort(num.begin(),num.end()); do{ ret.push_back(num); // for (int i : vec) printf("%d ",i); // printf("\n"); }while(next_permutation(num.begin(), num.end())); return ret; } };
C++ 解法, 执行用时: 3ms, 内存消耗: 416KB, 提交时间: 2022-07-26
class Solution { public: void rescusion(vector<vector<int>> &res,vector<int> &num,int index){ if(index==num.size()-1) res.push_back(num); vector<int> temp; temp=num; sort(temp.begin()+index,temp.end()); for(int i=index;i<temp.size();i++){ if(i>index&&(temp[i]==temp[i-1])) continue; swap(temp[i],temp[index]); rescusion(res,temp,index+1); swap(temp[i],temp[index]); } } vector<vector<int> > permuteUnique(vector<int> &num) { vector<vector<int>> res; sort(num.begin(),num.end()); rescusion(res, num, 0); return res; } };