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」に注意を払ってください!