列表

详情


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;
        
        
    }
};

上一题