[バックトラッキング] [leetcode]繰り返される番号はすべて配置されます

トピック:

繰り返される番号を含むことができるシーケンス番号を指定すると、繰り返されないすべての順列を任意の順序で返します。

例1:

入力:nums = [1,1,2]
出力:
[
 [1,1,2]、
 [1,2,1] [2,1,1]]
例2:

入力:nums = [1,2,3]
出力:[[1,2,3]、[1,3,2]、[2,1,3]、[2,3,1]、[3,1 、2]、[3,2,1]]

ソース:

47.フルアレンジメントII

問題解決のアイデア:バックトラック

繰り返しなしですべて同じ番号を配置し  、これに基づいて2ポイントを追加します。

  1. 配列を並べ替える
  2. 繰り返される番号は1回だけ使用され、その後の繰り返しはスキップされます

配列[1,1,2]がある場合、最初の1で始まる配列には[1,1,2]と[1,2,1]があり、2番目の1で始まる配列には[1,1]があります。 、2]と[1,2,1]、2つは同じです。したがって、最初の1が処理されると、次の1はスキップされます。

class Solution {
public:
    vector< vector<int> > result;
    vector<int> path;
    vector< vector<int> > permuteUnique(vector<int>& nums) {
        vector<bool> used(nums.size(), false);
        sort(nums.begin(), nums.end()); // 1,对数组排序
        back(nums, used);
        return result;
    }
    void back(const vector<int>& nums, vector<bool>& used) {
        if (path.size() == nums.size()) {
            result.push_back(path);
        }
        for (int i = 0; i < nums.size(); i++) {
            if (used[i]) continue;
            used[i] = true;
            path.push_back(nums[i]);
            back(nums, used);
            path.pop_back();
            used[i] = false;
            while (i+1 < nums.size() && nums[i] == nums[i+1]) i++; // 跳过后面重复数字
        }
    }
};

記事は何のデジタル完全な配列の繰り返し重複の場合には、デザインのアイデアの二種類の、またはそれを忘れて、やや複雑ではありません。

おすすめ

転載: blog.csdn.net/hbuxiaoshe/article/details/115139637