目錄
面試題 08.04. 冪集(同78. 子集)
90. 子集 ii
46. 全排列
77. 組合
39. 組合總和
冪集。編寫一種方法,返回某集合的所有子集。集合中不包含重複的元素。說明:解集不能包含重複的子集。
示例: 輸入: nums = [1,2,3] ,輸出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], ]
思路
一:全排列/組合/子集問題,比較相似,可用回溯法。
class solution(object):
def subsets(self, nums):
""":type nums: list[int]
:rtype: list[list[int]]
"""res, tmp = ,
self._helper(0, res, tmp, nums)
return res
def _helper(self, start_idx, res, tmp, nums):
if start_idx >= len(nums):
return
for i in range(start_idx, len(nums)):
self._helper(i + 1, res, tmp, nums)
tmp.pop()
給定乙個可能包含重複元素的整數陣列nums,返回該陣列所有可能的子集(冪集)。說明:解集不能包含重複的子集。
示例:輸入:[1,2,2],輸出:[ [2], [1], [1,2,2], [2,2], [1,2], ]
思路
一:該題與上一題的區別就是nums中有重複元素,但是解集不能包含重複子集。這一點可以通過排序加標記解決,當乙個元素與前面的元素相同時,若他之前的那個元素未被使用,則該元素也不能使用,否則會產生重複解。
class solution(object):
def subsetswithdup(self, nums):
""":type nums: list[int]
:rtype: list[list[int]]
"""nums = sorted(nums)
tmp, res, used = , , [false] * len(nums)
self._helper(0, used, tmp, res, nums)
return res
def _helper(self, start_idx, used, tmp, res, nums):
if start_idx >= len(nums):
return
for i in range(start_idx, len(nums)):
if i >= 1 and nums[i] == nums[i - 1] and not used[i - 1]:
continue
used[i] = true
self._helper(i + 1, used, tmp, res, nums)
tmp.pop()
used[i] = false
給定乙個沒有重複數字的序列,返回其所有可能的全排列。
示例:輸入:[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):
""":type nums: list[int]
:rtype: list[list[int]]
"""res, tmp, used = , , [false] * len(nums)
self._helper(tmp, used, res, nums)
return res
def _helper(self, tmp, used, res, nums):
if len(tmp) == len(nums):
return
for i in range(0, len(nums)):
if not used[i]:
used[i] = true
self._helper(tmp, used, res, nums)
tmp.pop()
used[i] = false
給定兩個整數 n 和 k,返回 1 ... n 中所有可能的 k 個數的組合。
示例:輸入:n = 4, k = 2輸出:[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
思路一:
class solution(object):
def combine(self, n, k):
""":type n: int
:type k: int
:rtype: list[list[int]]
"""if n < k or k <= 0:
return
tmp, res = ,
self._helper(1, tmp, res, n, k)
return res
def _helper(self, start_idx, tmp, res, n, k):
if len(tmp) == k:
return
for i in range(start_idx, n + 1):
self._helper(i + 1, tmp, res, n, k)
tmp.pop()
給定乙個無重複元素的陣列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 __init__(self):
self.s = 0
def combinationsum(self, candidates, target):
""":type candidates: list[int]
:type target: int
:rtype: list[list[int]]
"""res, tmp = ,
self._helper(0, tmp, res, candidates, target)
return res
def _helper(self, start_idx, tmp, res, candidates, target):
if self.s == target:
return
if self.s > target or start_idx >= len(candidates):
return
for i in range(start_idx, len(candidates)):
self.s += candidates[i]
self._helper(i, tmp, res, candidates, target)
self.s -= candidates[i]
tmp.pop()
LeetCode練習(十) 刪除陣列中的重複數字
給定乙個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 o 1 額外空間的條件下完成。classname leetcodeten description 給定乙個排序陣列,你需要在原地刪除重複出現的元...
leetcode中的旋轉排序陣列問題
關於旋轉排序陣列leetcode中共有4道題目,思路都是基於二分查詢。假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 0,1,2,4,5,6,7 可能變為 4,5,6,7,0,1,2 找最小值和普通搜尋兩種 找最小值問題 1.假設陣列中不存在相同元素 153題 中等 示例 輸入 ...
leetcode關於陣列的問題
解題思路 這個一開始我是沒想到思路的 除了遍歷 因為有正負號的問題,後來看了一下別人的思路然後自己寫的,思路是這樣的 三個數乘積最大只能有兩種情況,一種是三個最大正數直接乘起來最大,另一種就是兩個最小的負數乘起來再乘以乙個最大的正數。第一步 跟前面的那個414.第三大的數乙個思路,遍歷找到最大的三個...