Leetcode后面的数学问题47排列II
-
29-09-2020 - |
题
请告诉我为什么表达式属植物发电机码代码适用于获取独特的排列。它背后的数学是什么?
问题如下:
给定可能包含重复项的数字集合,返回所有可能的独特排列。
示例:
Input: [1,1,2]
Output:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
.
以下是代码:
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int>> result;
vector<int> temp;
vector<bool> used(nums.size(), false);
sort(nums.begin(), nums.end());
backtrack(nums, temp, result, used);
return result;
}
void backtrack(vector<int>& nums, vector<int>& temp, vector<vector<int>>& result, vector<bool>& used){
if(temp.size() == nums.size()){
result.emplace_back(temp);
}else{
for(int i=0; i<nums.size(); i++){
if(used[i] || i>0 && nums[i] == nums[i-1] && !used[i-1]) continue;
used[i] = true;
temp.push_back(nums[i]);
backtrack(nums, temp, result, used);
used[i] = false;
temp.pop_back();
}
}
}
};
. 解决方案
(1)您正在对向量进行排序,以便在向量中连续呈现重复值。
(2)现在我们来到该条件后面的逻辑:
- 由于向量可以包含重复项,我们应该通过再次以相同的元素开始(重复)来确保不要重复相同的序列
- 示例:
-
1,1,2
(以first
oon开头一个)和1,1,2(以second
oon开头)=>两者都相同(我们应该确保这不会发生)
-
- 示例:
示例:在[1, 1, 2]
-
如果选择序列中的第一个元素被选为1,那么我们应该确保我们不会以另一个1(元素的复制)开始创建另一个序列。
-
所以,我们需要跳过所有连续重复元素的循环。
在您的情况下,在使用前1的侧序后创建序列后,当我们在第二次输入循环时,我们检查当前元素是否是重复的世代ocodetagcode(这就像已经对向量排序的那样)以及当前元素是序列生成的第一个元素。
- 在您的情况下,由于这种情况,第二个不能是序列的第一个元素。
不隶属于 cs.stackexchange