leetcode陣列中的問題(十)

2021-10-04 03:20:17 字數 4378 閱讀 2870

目錄

面試題 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.第三大的數乙個思路,遍歷找到最大的三個...