全排列--力扣

Posted 穿迷彩服的鲨鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全排列--力扣相关的知识,希望对你有一定的参考价值。


前言

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。


一、示例

示例 1:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:

输入:nums = [0,1]
输出:[[0,1],[1,0]]
示例 3:

输入:nums = [1]
输出:[[1]]

二、代码解析

1.回溯

代码如下(示例):

void backtrack(vector<vector<int>>& res, vector<int>& output, int first, int len)
{
	// 所有数都填完了
	if (first == len)
	{
		res.emplace_back(output);
		return;
	}
	for (int i = first; i < len; ++i)
	{
		// 动态维护数组
		swap(output[i], output[first]);
		// 继续递归填下一个数
		backtrack(res, output, first + 1, len);
		// 撤销操作
		swap(output[i], output[first]);
	}
}

vector<vector<int>> permute(vector<int>& nums)
{
	vector<vector<int> > res;
	backtrack(res, nums, 0, (int)nums.size());
	return res;
}

结果

在这里插入图片描述

2.测试

代码如下(示例):

#include<vector>
#include <iostream>
using namespace std;

void backtrack(vector<vector<int>>& res, vector<int>& output, int first, int len)
{
	// 所有数都填完了
	if (first == len)
	{
		res.emplace_back(output);
		return;
	}
	for (int i = first; i < len; ++i)
	{
		// 动态维护数组
		swap(output[i], output[first]);
		// 继续递归填下一个数
		backtrack(res, output, first + 1, len);
		// 撤销操作
		swap(output[i], output[first]);
	}
}

vector<vector<int>> permute(vector<int>& nums)
{
	vector<vector<int> > res;
	backtrack(res, nums, 0, (int)nums.size());
	return res;
}

int main()
{
	vector<int> nums = { 1,2,3 };
	vector<vector<int>> allPermutation = permute(nums);
	for (int i = 0; i < allPermutation.size(); i++)
	{
		for (int j = 0; j < allPermutation[i].size(); j++)
		{
			cout << allPermutation[i][j] << " ";
		}
		cout << endl;
	}

	return 0;
}

结果

在这里插入图片描述


总结

在这里插入图片描述

以上是关于全排列--力扣的主要内容,如果未能解决你的问题,请参考以下文章

力扣-46-全排列

回溯算法详解[力扣46:全排列]

精选力扣500题 第28题 LeetCode 46. 全排列c++ / java 详细题解

力扣算法JS LC [46. 全排列] LC [47. 全排列 II]

全排列 II(力扣第47题)

力扣:全排列(回溯算法)