Leetcode31.Permutation_II

运用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;
	}
};

猜你喜欢

转载自blog.csdn.net/qq_42263831/article/details/82765010