トピック:
繰り返される番号を含むことができるシーケンス番号を指定すると、繰り返されないすべての順列を任意の順序で返します。
例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]]
ソース:
問題解決のアイデア:バックトラック
繰り返しなしですべて同じ番号を配置し 、これに基づいて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++; // 跳过后面重复数字
}
}
};
記事は何のデジタル完全な配列の繰り返し重複の場合には、デザインのアイデアの二種類の、またはそれを忘れて、やや複雑ではありません。