LeetCode 47--完全な配列II

1.トピック

2.回答

46--完全配列LeetCode我々は既に知っている、実際には、全体の構成は、次に、残りのサブ問題であり、第1の特定の要素の位置を決定することです。その質問では、データが繰り返されていないので、データの任意の要素が最後の位置に配置することができます。

データは言葉を繰り返す必要が場合は、重複したデータは、最終的な結果に同じである、我々はデエンファシスが必要です。ここでは、まず、それぞれが第一の位置までのデータ交換に続いて、データの並べ替えを行い、それが最初のデータが等しくない、と我々は戻って交換する必要がない場合は、最後のサブ問題は、再帰的に解決することができます。

などのデータ[1、3、3、4]、最初の交換がされている[1、3、3、4]、最初の要素のための1 [3、1、3、4]の第二の交換、3第交換3,3は、第四の要素[4、1、3、3]の最初の交換のための交換を;;繰り返すことなく、等しく、最初の要素4です。あなたは、あなたがそれぞれ再帰的にすることができ、これは3例、合計の最初の要素である場合、見ることができます。

class Solution {

    vector<vector<int>> result;

public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        
        int n = nums.size();
        sort(nums.begin(), nums.end());
        Generate_Premutations(nums, 0, n-1);
        return result;       
    }
    
    void Generate_Premutations(vector<int> nums, int left, int right)
    {
        if (left == right)
        {
            result.push_back(nums);
        }
        else
        {
            for (int i = left; i <= right; i++)
            {
                if (i != left && nums[i] == nums[left])   continue; 
                // 交换后就不再交换回来了,需传值而不是传引用,否则递归调用就会改变数组
                swap(nums[left], nums[i]);
                Generate_Premutations(nums, left+1, right);          
            }
        }
    }
};

よりエキサイティングについては、「seniusen」に注意を払ってください!

おすすめ

転載: www.cnblogs.com/seniusen/p/10942400.html