赞
踩
递归做法,一般会有visit数组来判断第 i 位是否被考虑了。我们先考虑第0位,再考虑第1位,再考虑第2位...dfs函数中还是老套路,先判定特殊条件,再从当下的角度(决定第 j 位是哪个元素),依次遍历visit数组,依次将visit值为0的元素赋给第 j 位,并继续递归(记住要恢复现场)。
- 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;
- }
- };
- 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]=1
- path.append(nums[j])
- dfs(visit,res,nums,path,i+1,len_)
- visit[j]=0
- path.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操作
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。