全排列ⅠⅡ(回溯+剪枝)

在这里插入图片描述

class Solution {
public:
	vector<vector<int>> permute(vector<int>& nums) {
		vector<vector<int>>res;
		DFS(res, temp, nums, 0);
		return res;
	}
	void DFS(vector<vector<int>>&res, vector<int>&temp, vector<int>& nums, int start)
	{

		if (start == nums.size())
		{
			res.push_back(nums);
			return;
		}

		for (int i = start; i < nums.size(); i++)
		{
			swap(nums[start], nums[i]);
			DFS(res, temp, nums, start + 1);//完成后续的全排列
			swap(nums[start], nums[i]);//回溯
		}

	}
};

或者

class Solution {
public:
	vector<vector<int>> permute(vector<int>& nums) {
		vector<vector<int>>res;
		vector<int>temp;
		vector<bool>used(nums.size(), false);
		sort(nums.begin(), nums.end());
		DFS(res, temp, used, nums, 0);
		return res;
	}
	void DFS(vector<vector<int>>& res, vector<int>& temp, vector<bool>&used, vector<int>& nums, int start)
	{


		if (start == nums.size())
		{
			res.push_back(temp);
			return;

		}

		for (int i = 0; i < nums.size(); i++)
		{
			if (used[i] == true)
				continue;

			used[i] = true;
			temp.push_back(nums[i]);
			DFS(res, temp, used, nums, start + 1);
			temp.pop_back();
			used[i] = false;
		}

	}
};

在这里插入图片描述
先按升序排列,再进行剪枝。
在这里插入图片描述

class Solution {
public:
	vector<vector<int>> permuteUnique(vector<int>& nums) {
		vector<vector<int>>res;
		vector<int>temp;
		vector<bool>used(nums.size(), false);
		sort(nums.begin(), nums.end());
		DFS(res, temp, used, nums, 0);
		return res;
	}
	void DFS(vector<vector<int>>& res, vector<int>& temp, vector<bool>&used, vector<int>& nums, int start)
	{


		if (start == nums.size())
		{
			res.push_back(temp);
			return;

		}

		for (int i = 0; i < nums.size(); i++)
		{
			if (used[i] == true)
				continue;

			if (i >= 1 && used[i - 1] == false && nums[i] == nums[i - 1])//剪枝
				continue;

			used[i] = true;
			temp.push_back(nums[i]);
			DFS(res, temp, used, nums, start + 1);
			temp.pop_back();
			used[i] = false;
		}

	}
};
发布了212 篇原创文章 · 获赞 4 · 访问量 8801

猜你喜欢

转载自blog.csdn.net/ShenHang_/article/details/104555923