LeetCode 46. 全排列
题目描述
给定一个不含重复数字的数组 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.辅助数组
解题思路
创建一个数组来记录是否已经访问的标记,i表示已经存了第几个数,j表示从第几个数开始存,回溯条件为i == n,回溯时候,on_path数组要恢复,最终返回的数组正好是N!个。
class Solution {
public:vector<vector<int>> permute(vector<int>& nums) {int n = nums.size();vector <vector <int>> ans;vector <int> path(n);vector <bool> on_path(n);auto dfs = [&](this auto && dfs,int i){if(i == n){ans.push_back(path);return;}for(int j = 0;j < n;j ++){if(!on_path[j]){path[i] = nums[j];on_path[j] = true;dfs(i + 1);on_path[j] = false;}}};dfs(0);return ans;}
};
时间复杂度O(N·N!),空间复杂度O(N)