1. 程式人生 > >[Leetcode] Permutations II

[Leetcode] Permutations II

perm 查重 res 不能 描述 出現 bool com sed

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進行染色,並且由於對數組已經進行了排序,查重的時候只需檢查前一項是否與當前項相同且已經染色。

[Leetcode] Permutations II