• [Leetcode] Permutations II


    Permutations II 题解

    题目来源:https://leetcode.com/problems/permutations-ii/description/


    Description

    Given a collection of numbers that might contain duplicates, return all possible unique permutations.

    Example

    For example,
    [1,1,2] have the following unique permutations:

    [
      [1,1,2],
      [1,2,1],
      [2,1,1]
    ]
    

    Solution

    class Solution {
    private:
        void dfs(vector<int>& nums, vector<bool>& used, vector<int>& path, 
                    vector<vector<int> >& res) {
            if (path.size() == nums.size()) {
                res.push_back(path);
            } else {
                int size = nums.size();
                for (int i = 0; i < size; i++) {
                    if (used[i])
                        continue;
                    if (i > 0 && nums[i] == nums[i - 1] && used[i - 1])
                        continue;
                    used[i] = true;
                    path.push_back(nums[i]);
                    dfs(nums, used, path, res);
                    path.pop_back();
                    used[i] = false;
                }
            }
        }
    public:
        vector<vector<int> > permuteUnique(vector<int> &nums) {
            vector<vector<int> > res;
            vector<int> path;
            vector<bool> used(nums.size(), false);
            sort(nums.begin(), nums.end());
            dfs(nums, used, path, res);
            return res;
        }
    };
    

    解题描述

    这道题是Permutations的升级版本,要对给出的数组进行全排列,并且不能出现重复的解法。一开始没有想到怎么去标记重复,就直接套用第一版的解法然后在插入结果的时候遍历查重。之后看了评论区的解法之后才改进了解法:先对数组进行排序,然后进行DFS,过程中使用布尔数组used进行染色,并且由于对数组已经进行了排序,查重的时候只需检查前一项是否与当前项相同且已经染色。

  • 相关阅读:
    HashMap
    java反射
    arraylist和linkedlist区别
    int和Integer的区别
    java 数组排序并去重
    矩阵链乘法问题
    找零问题
    硬币收集问题
    最大借书量问题
    钢条切割问题
  • 原文地址:https://www.cnblogs.com/yanhewu/p/8417144.html
Copyright © 2020-2023  润新知