1.题目
题目地址(46. 全排列 - 力扣(LeetCode))
https://leetcode.cn/problems/permutations/
题目描述
给定一个不含重复数字的数组 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 <= nums.length <= 6
-10 <= nums[i] <= 10
nums
中的所有整数 互不相同
2. 题解
2.1 全排列函数 next_permutation的使用(还有一个prev_permutation)
思路
next_permutation 可以按字典序排列获取下一个字典序稍大的组合, 如果不存在则返回
代码
- 语言支持:C++
C++ Code:
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int>> ans;
do {
ans.push_back(nums);
} while (next_permutation(nums.begin(), nums.end()));
return ans;
}
};
复杂度分析
令 n 为数组长度。
由于它需要检查所有可能的排列来找到下一个排列。
在最坏的情况下,即当排列是按字典序排序的最后一个排列时,需要检查所有 n! 种可能的排列才能确定下一个排列
- 时间复杂度:\(O(n!)\)
- 空间复杂度:\(O(1)\)
2.2 回溯
思路
代码
复杂度分析
令 n 为数组长度。
- 时间复杂度:\(O(n)\)
- 空间复杂度:\(O(n)\)