当前位置:   article > 正文

力扣---全排列---回溯

力扣---全排列---回溯

思路:

递归做法,一般会有visit数组来判断第 i 位是否被考虑了。我们先考虑第0位,再考虑第1位,再考虑第2位...dfs函数中还是老套路,先判定特殊条件,再从当下的角度(决定第 j 位是哪个元素),依次遍历visit数组,依次将visit值为0的元素赋给第 j 位,并继续递归(记住要恢复现场)。

代码:

C++:

  1. class Solution {
  2. public:
  3. void dfs(vector<int>& visit,vector<vector<int>>& res,vector<int>& nums,vector<int>& path,int i,int len){
  4. if(i==len){
  5. res.push_back(path);
  6. return;
  7. }
  8. //考虑第i位
  9. for(int j=0;j<len;j++){
  10. if(visit[j]==0){
  11. visit[j]=1;
  12. path.push_back(nums[j]);
  13. dfs(visit,res,nums,path,i+1,len);
  14. visit[j]=0;
  15. path.pop_back();
  16. }
  17. }
  18. }
  19. vector<vector<int>> permute(vector<int>& nums) {
  20. vector<vector<int>> res;
  21. int len=nums.size();
  22. vector<int> visit(len,0);
  23. vector<int> path;
  24. dfs(visit,res,nums,path,0,len);
  25. return res;
  26. }
  27. };

Python:

  1. class Solution:
  2. def permute(self, nums: List[int]) -> List[List[int]]:
  3. def dfs(visit:List[int],res:List[List[int]],num:List[int],path:List[int],i:int,len_:int):
  4. if i==len_:
  5. res.append(path.copy())
  6. return
  7. for j in range(len_):
  8. if visit[j]==0:
  9. visit[j]=1
  10. path.append(nums[j])
  11. dfs(visit,res,nums,path,i+1,len_)
  12. visit[j]=0
  13. path.pop()
  14. res=[]
  15. len_=len(nums)
  16. visit=[0]*len_
  17. path=[]
  18. dfs(visit,res,nums,path,0,len_)
  19. return res

注意这句话:

res.append(path.copy()),将 path:List[int] 加入到 res:List[List[int]] 类型中时,记得先将path copy一下,再进行append操作

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号