题解 | #有重复项数字的全排列#

有重复项数字的全排列

https://www.nowcoder.com/practice/a43a2b986ef34843ac4fdd9159b69863

思路:由于要升序排列,可以先对原数组进行升序排序。由于此题的数组长度不长,用冒泡排序就行。然后用递归列举出全排列,其中针对相同数字可以用一个map记录下出现过的数字,并且要在每一层递归中用一个新的map去记录。若出现过,就跳过此数字。

#include <unordered_map>
#include <vector>
class Solution {
  public:
    vector<vector<int> > permuteUnique(vector<int>& num) {
        sort(num);
        return permute(num);
    }

    void sort(vector<int>& num) { //冒泡排序
        int tmp;
        for (int j = 0; j < num.size() - 1; j++) {
            for (int i = 0; i < num.size() - j - 1; i++) {
                if (num[i] > num[i + 1]) {
                    tmp = num[i];
                    num[i] = num[i + 1];
                    num[i + 1] = tmp;
                }
            }
        }
    }

    vector<vector<int> > permute(vector<int>& num) {
        vector<vector<int>> res;
        vector<int> tmpnum;
        if (num.size() == 1) {
            tmpnum.push_back(num[0]);
            res.push_back(tmpnum);
            return res;
        }
        vector<vector<int>> tmpres;
        unordered_map<int, bool> hash; // 记录数字是否出现过
        for (int i = 0; i < num.size(); i++) {
            if (hash[num[i]]) {
                continue;
            } else {
                hash[num[i]] = true;
            }
            tmpnum = num;
            tmpnum.erase(tmpnum.begin() + i);
            tmpres = permute(tmpnum);
            for (int j = 0; j < tmpres.size(); j++) {
                tmpres[j].insert(tmpres[j].begin(), num[i]);
                res.push_back(tmpres[j]);
            }
        }
        return res;
    }
};

全部评论

相关推荐

刘湘_passion:太强了牛肉哥有被激励到
点赞 评论 收藏
分享
有担当的灰太狼又在摸鱼:零帧起手查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务