日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

递归算法(三)- 回溯法Backtracking

發布時間:2023/12/4 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 递归算法(三)- 回溯法Backtracking 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

回溯法

回溯法Backtracking(找所有的可能)遞歸:

  • 類似枚舉,一層一層向下遞歸,嘗試搜索答案。
  • 找到答案: => 返回答案,并嘗試別的可能
  • 未找到答案: => 返回上一層遞歸,嘗試別的可能
  • 實戰

    給你一個整數數組 nums ,數組中的元素 互不相同 。返回該數組所有可能的子集(冪集)。

    解集 不能 包含重復的子集。你可以按 任意順序 返回解集。

    注意:在設計算法時,要謹記我們之前所說的遞歸四要素:

  • 接收的參數
  • 返回值
  • 終止條件
  • 遞歸拆解:如何遞歸下一層
  • class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:# 擴展法# [ ]# [1]# [2] [1,2]# [3] [1,3] [2,3] [1,2,3]# res = []# res.append([])# for num in nums:# temp = [] # 用于存儲擴展后的若干子集# for i in res:# r = list(i) # 相當于copy,避免引用傳遞# r.append(num)# temp.append(r)# for r in temp:# res.append(r)# return res# 方法二:回溯法:[1,2,3] 子集長度介于0--3# Time Complexity:O(N*2^N)# Space Complexity:O(N*2^N)# 長度# 0 [ ]# 1 [1] [2] [3]# 2 [1,2] [1,3] [2,3]# 3 [1,2,3]result = [[]]# 因為等于0 的長度(空集)已經加進去了for i in range(1,len(nums)+1): self.backtracking(nums,result,i,0,[])return resultdef backtracking(self,nums,result,lenght,index,subset):# 終止條件:子集的長度 == 要找的長度if len(subset) == lenght:temp = list(subset) # 相當于copy,避免引用傳遞 list(subset) 等價于 subset[:]result.append(temp)return# 循環部分for i in range(index,len(nums)):subset.append(nums[i])self.backtracking(nums,result,lenght,i+1,subset)subset.pop() # 當backtracking出來一定要把新加入的元素刪除掉# 方法三 DFS # Time Complexity:O(N*2^N)# Space Complexity:O(N*2^N)# result = []# self.dfs(nums,result,0,[])# return result# def dfs(self,nums,result,index,subset):# result.append(subset[:])# # 終止條件# if index == len(nums):# return # for i in range(index,len(nums)):# subset.append(nums[i])# self.dfs(nums,result,i+1,subset)# subset.pop()

    總結

    以上是生活随笔為你收集整理的递归算法(三)- 回溯法Backtracking的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。