思路:
递归做法,一般会有visit数组来判断第 i 位是否被考虑了。我们先考虑第0位,再考虑第1位,再考虑第2位...dfs函数中还是老套路,先判定特殊条件,再从当下的角度(决定第 j 位是哪个元素),依次遍历visit数组,依次将visit值为0的元素赋给第 j 位,并继续递归(记住要恢复现场)。
代码:
C++:
class Solution {
public:void dfs(vector<int>& visit,vector<vector<int>>& res,vector<int>& nums,vector<int>& path,int i,int len){if(i==len){res.push_back(path);return;}//考虑第i位for(int j=0;j<len;j++){if(visit[j]==0){visit[j]=1;path.push_back(nums[j]);dfs(visit,res,nums,path,i+1,len);visit[j]=0;path.pop_back();}}}vector<vector<int>> permute(vector<int>& nums) {vector<vector<int>> res;int len=nums.size();vector<int> visit(len,0);vector<int> path;dfs(visit,res,nums,path,0,len);return res;}
};
Python:
class Solution:def permute(self, nums: List[int]) -> List[List[int]]:def dfs(visit:List[int],res:List[List[int]],num:List[int],path:List[int],i:int,len_:int):if i==len_:res.append(path.copy())return for j in range(len_):if visit[j]==0:visit[j]=1path.append(nums[j])dfs(visit,res,nums,path,i+1,len_)visit[j]=0path.pop()res=[]len_=len(nums)visit=[0]*len_path=[]dfs(visit,res,nums,path,0,len_)return res
注意这句话:
res.append(path.copy()),将 path:List[int] 加入到 res:List[List[int]] 类型中时,记得先将path copy一下,再进行append操作