目錄leetcode
給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集(冪集)。
說明:解集不能包含重複的子集。
示例:
輸入: nums = [1,2,3]
輸出:[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
]
這題非常的重要 是所有回溯變形的根源
class solution(object):
def subsets(self, nums):
def subsets_help(tmp_lis, nums, result, position):
for i in range(position, len(nums)):
subsets_help(tmp_lis+[nums[i]], nums, result, i+1)
# tmp_lis.pop()
tmp_lis =
result =
position = 0
subsets_help(tmp_lis, nums, result, position)
return result
leetcode
給定乙個可能包含重複元素的整數陣列 nums,返回該陣列所有可能的子集(冪集)。
說明:解集不能包含重複的子集。
示例:
輸入: [1,2,2]
輸出:[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
]
class solution(object):
def subsetswithdup(self, nums):
result =
tmp_lis =
nums.sort()
self.subsetswithdup_help(result, tmp_lis, nums, 0)
return result
def subsetswithdup_help(self, result, tmp_lis, nums, position):
for i in range(position, len(nums)):
if i != position and nums[i] == nums[i-1]:
continue
self.subsetswithdup_help(result, tmp_lis, nums, i+1)
tmp_lis.pop()
leetcode
給出集合[1,2,3,…,n]
,其所有元素共有 n! 種排列。
按大小順序列出所有排列情況,並一一標記,當n = 3
時, 所有排列如下:
"123"
"132"
"213"
"231"
"312"
"321"
給定 n 和 k,返回第 k 個排列。
說明:給定 n 的範圍是 [1, 9]。
給定 k 的範圍是[1, n!]。
示例 1:
輸入: n = 3, k = 3
輸出: "213"
示例 2:
輸入: n = 4, k = 9
輸出: "2314"
這題真的做不出來 列印就可以
給定乙個沒有重複數字的序列,返回其所有可能的全排列。
示例:
輸入: [1,2,3]
輸出:[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
class solution(object):
def permute(self, nums):
result =
tmp_lis =
self.permute_help(result, tmp_lis, nums)
return result
def permute_help(self, result, tmp_lis, nums):
if len(nums) == 0:
return
for i in range(len(nums)):
self.permute_help(result, tmp_lis+[nums[i]], nums[0:i]+nums[i+1:])
leetcode
思路和上面的去重一樣
leetcode
給定乙個無重複元素的陣列 candidates 和乙個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。
candidates 中的數字可以無限制重複被選取。
說明:所有數字(包括 target)都是正整數。
解集不能包含重複的組合。
示例 1:
輸入: candidates = [2,3,6,7], target = 7,
所求解集為:
[ [7],
[2,2,3]
]示例 2:
輸入: candidates = [2,3,5], target = 8,
所求解集為:
[ [2,2,2,2],
[2,3,3],
[3,5]
]
class solution(object):
def combinationsum(self, candidates, target):
def combinationsumhelp(nums, remains, tmp_lis, result, start):
if remains < 0:
return
if remains == 0:
for i in range(start, len(nums)):
combinationsumhelp(nums, remains-nums[i], tmp_lis, result, i)
tmp_lis.pop()
tmp_lis =
result =
combinationsumhelp(candidates, target, tmp_lis, result, 0)
return result
leetcode
給定乙個陣列 candidates 和乙個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。
candidates 中的每個數字在每個組合中只能使用一次。
說明:所有數字(包括目標數)都是正整數。
解集不能包含重複的組合。
示例 1:
輸入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集為:
[ [1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]示例 2:
輸入: candidates = [2,5,2,1,2], target = 5,
所求解集為:
[ [1,2,2],
[5]]
class solution(object):
def combinationsum2(self, candidates, target):
def combinationsum2help(nums, remains, result, tmp_lis, start):
if remains < 0:
return
if remains == 0:
return
for i in range(start, len(nums)):
# if i!=0 and nums[i]==nums[i-1]:
if i>start and nums[i]==nums[i-1]:
continue
combinationsum2help(nums, remains-nums[i], result, tmp_lis, i+1)
tmp_lis.pop()
candidates.sort()
result =
combinationsum2help(candidates, target, result, , 0)
return result
回溯 leetcode回溯演算法
回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就 回溯 返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,...
leetcode 回溯 子集
方法一 迭代 class solution def subsets self,nums list int list list int res for i in nums res res i num for num in res 結果加上新的元素和結果匹配的 return resclass solut...
leetcode 回溯法 模板
dfs 模板.param in input 輸入資料指標 param out path 當前路徑,也是中間結果 param out result 存放最終結果 param inout cur or gap 標記當前位置或距離目標的距離 return 路徑長度,如果是求路徑本身,則不需要返回長度 vo...