0046.Permutations

全排列

1. 题目

1.1. 描述

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

1.2. 示例

示例 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.3. 提示

  • 1 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • nums 中的所有整数互不相同

2. 思路

2.1. 解法一

  • 设置visited数组标记循环中是否访问过元素,用dfs递归函数从头开始
  • 记录已拼元素,当达到nums数组长度就得到一个全排列
  • 时间复杂度为O(n!),空间复杂度为O(n)

2.2. 解法二

  • 交换nums数组中的nums[start],nums[i]
  • 时间复杂度为O(n!),空间复杂度为O(n)

2.3. 解法三

  • 数组长度为1时,数组只有一个数a1,全排列只有一种可能即为a1
  • 数组长度为2时,数组中有两个数a1a2,全排列有两种可能即为a1a2,a2a1。在a1左右插入了a2
  • 数组长度为3时,数组中有两个数a1a2a3,全排列有六种可能。是在a1a2,a2a1左中右插入了a3

2.4. 解法四

  • STL 的内置函数 next_permutation(),返回下一个全排列

3. 代码

3.1. C++

3.1.1. 解法一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
int n = nums.size();
vector<vector<int> > ans;
vector<int> visited(n,0);
vector<int> perm;
dfs(nums,0,n,visited,perm,ans);
return ans;
}
void dfs(vector<int> nums,int index,int n,vector<int> visited,vector<int> perm,vector<vector<int> > &ans){
if(index==n){
ans.push_back(perm);
return;
}
for (int i = 0; i < n; i++)
{
if(visited[i]==0){
perm.push_back(nums[i]);
visited[i]=1;
dfs(nums,index+1,n,visited,perm,ans);
perm.pop_back();
visited[i]=0;
}
}
}
};

3.1.2. 解法二

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
int n = nums.size();
vector<vector<int> > ans;
dfs(nums,0,n,ans);
return ans;
}
void dfs(vector<int> nums,int index,int n,vector<vector<int> > &ans){
if(index==n){
ans.push_back(nums);
return;
}
for (int i = index; i < n; i++)
{
swap(nums[index],nums[i]);
dfs(nums,index+1,n,ans);
swap(nums[i],nums[index]);
}
}
};

3.1.3. 解法三-递归

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
if (nums.empty()) return vector<vector<int>>(1);
vector<vector<int>> res;
int first = nums[0];
nums.erase(nums.begin());
vector<vector<int>> words = permute(nums);
for (auto &a : words) {
for (int i = 0; i <= a.size(); ++i) {
a.insert(a.begin() + i, first);
res.push_back(a);
a.erase(a.begin() + i);
}
}
return res;
}
};

3.1.4. 解法三-迭代

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res{{}};
for (int a : nums) {
for (int k = res.size(); k > 0; --k) {
vector<int> t = res.front();
res.erase(res.begin());
for (int i = 0; i <= t.size(); ++i) {
vector<int> one = t;
one.insert(one.begin() + i, a);
res.push_back(one);
}
}
}
return res;
}
};

3.1.5. 解法四

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
sort(nums.begin(), nums.end());
res.push_back(nums);
while (next_permutation(nums.begin(), nums.end())) {
res.push_back(nums);
}
return res;
}
};

3.2. Java

3.2.1. 解法一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> ans = new ArrayList<>();
List<Integer> visited = new LinkedList<>();
List<Integer> perm = new LinkedList<>();
dfs(nums,0,visited,perm,ans);
return ans;
}
private void dfs(int[] nums,int index,List<Integer> visited,List<Integer> perm,List<List<Integer>> ans){
if(index==nums.length){
ans.add(new ArrayList<>(perm));
return;
}
for (int num : nums) {
if(visited.contains(num)==false){
visited.add(num);
perm.add(num);
dfs(nums,index+1,visited,perm,ans);
visited.remove(visited.size()-1);
perm.remove(perm.size()-1);
}
}
}
}

3.2.2. 解法二

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> ans = new ArrayList<>();
dfs(nums,0,ans);
return ans;
}
private void dfs(int[] nums,int index,List<List<Integer>> ans){
if(index>=nums.length){
List<Integer> temp = new ArrayList<>();
for (int num : nums) {
temp.add(num);
}
ans.add(temp);
return;
}
for (int i = index;i<nums.length;i++) {
swap(nums,index,i);
dfs(nums,index+1,ans);
swap(nums,index,i);
}
}
private void swap(int[] nums,int a,int b){
int temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
}
}
本文结束  感谢您的阅读
  • 本文作者: Wang Ting
  • 本文链接: /zh-CN/2017/07/18/0046-Permutations/
  • 发布时间: 2017-07-18 01:13
  • 更新时间: 2025-01-08 21:36
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!