请告诉我为什么表达式属植物发电机码代码适用于获取独特的排列。它背后的数学是什么?
问题如下:
给定可能包含重复项的数字集合,返回所有可能的独特排列。 示例:

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(这就像已经对向量排序的那样)以及当前元素是序列生成的第一个元素。

    • 在您的情况下,由于这种情况,第二个不能是序列的第一个元素。
许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top