运用Leetcode31Next_Permutation中函数,稍微更改使返回一个bool值显示是否有下一个排列。
如果运用Leetcode46.Permutation中的递归函数,需要另一个数组标记前面访问的情况。
设标记数组:bool visit,未访问过的标记为true,访问过的标记为false。
如果nums[n-1] == nums[n]
且visit[n-1] ==false
说明之前有访问过与后面相同的元素。
两个相同元素在同一位置,其他元素的排列情况应完全相同,所以在此进行剪枝操作。
时间复杂度:O(N!)
C++代码:
class Solution {
public:
vector<vector<int>> result;
vector<vector<int>> permuteUnique(vector<int>& nums) {
sort(nums.begin(), nums.end());
do
{
result.push_back(nums);
} while (nextPermutation(nums));
return result;
}
bool nextPermutation(vector<int>& nums) {
if (nums.size() == 1)
return false;
if (nums.size() == 2)
{
if (nums[1] > nums[0])
{
reverse(nums.begin(), nums.end());
return true;
}
else
return false;
}
auto it = nums.end() - 1, it_2 = nums.end() - 1, it_find = nums.end() - 1;
while (1)
{
if (*it > *(it - 1))
{
it--;
break;
}
it--;
if (it == nums.begin())
return false;
}
while (it_2 > it)
{
if (*it_find <= *it)
it_find--;
else if (*it_2 < *it_find && *it_2 > *it)
it_find = it_2;
it_2--;
}
swap(*it, *it_find);
reverse(it + 1, nums.end());
return true;
}
};