目录
1. 组合总和 II 🌟🌟
2. 加一 🌟
3. 从中序与后序遍历序列构造二叉树 🌟🌟
🌟 每日一练刷题专栏 🌟
Golang每日一练 专栏
Python每日一练 专栏
C/C++每日一练 专栏
Java每日一练 专栏
1. 组合总和 II
给定一个数组 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]]
出处:
https://edu.csdn.net/practice/26142804
代码:
class Solution(object):
def combinationSum2(self, candidates, target):
"""
:type candidates: List[int]
:type target: int
:rtype: List[List[int]]
"""
candidates.sort()
dp = [[] for _ in range(target + 1)]
dp[0].append([])
for i in range(1, target + 1):
for j in range(len(candidates)):
if candidates[j] > i:
break
for k in range(len(dp[i - candidates[j]])):
temp = dp[i - candidates[j]][k][:]
if len(temp) > 0 and temp[-1] >= j:
continue
temp.append(j)
dp[i].append(temp)
res = []
check = {}
for temp in dp[target]:
value = [candidates[t] for t in temp]
try:
check[str(value)] += 1
except KeyError:
check[str(value)] = 1
res.append(value)
return res
# %%
s = Solution()
print(s.combinationSum2(candidates = [10,1,2,7,6,1,5], target = 8))
print(s.combinationSum2(candidates = [2,5,2,1,2], target = 5))
输出:
[[1, 2, 5], [1, 1, 6], [2, 6], [1, 7]]
[[1, 2, 2], [5]]
2. 加一
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入:digits = [1,2,3] 输出:[1,2,4] 解释:输入数组表示数字 123。
示例 2:
输入:digits = [4,3,2,1] 输出:[4,3,2,2] 解释:输入数组表示数字 4321。
示例 3:
输入:digits = [0] 输出:[1]
提示:
1 <= digits.length <= 100
0 <= digits[i] <= 9
出处:
https://edu.csdn.net/practice/26142805
代码:
class Solution(object):
def plusOne(self, digits):
ls = len(digits)
for index in reversed(range(ls)):
if digits[index] < 9:
digits[index] += 1
return digits
else:
digits[index] = 0
digits.insert(0, 1)
return digits
# %%
s = Solution()
print(s.plusOne(digits = [1,2,3]))
print(s.plusOne(digits = [4,3,2,1]))
print(s.plusOne(digits = [0]))
print(s.plusOne(digits = [9,9,9]))
输出:
[1, 2, 4]
[4, 3, 2, 2]
[1]
[1, 0, 0, 0]
3. 从中序与后序遍历序列构造二叉树
根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
3 / \ 9 20 / \ 15 7
出处:
https://edu.csdn.net/practice/26142806
代码:
from typing import List
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
def levelOrder(self):
if not self: return []
res, que = [], [self]
while que:
cur = que.pop(0)
if cur:
res.append(cur.val)
que.append(cur.left)
que.append(cur.right)
else:
res.append(None)
while res[-1] is None:
res.pop()
return res
class Solution:
def buildTree(self, inorder: List[int], postorder: List[int]) -> TreeNode:
def build_tree(in_left, in_right, post_left, post_right):
if in_left > in_right:
return
post_root = post_right
root = TreeNode(postorder[post_root])
in_root = inorder_map[root.val]
size_of_left = in_root - in_left
root.left = build_tree(
in_left, in_root - 1, post_left, post_left + size_of_left - 1
)
root.right = build_tree(
in_root + 1, in_right, post_left + size_of_left, post_root - 1
)
return root
size = len(inorder)
inorder_map = {}
for i in range(size):
inorder_map[inorder[i]] = i
return build_tree(0, size - 1, 0, size - 1)
#%%
inorder = [9,3,15,20,7]
postorder = [9,15,7,20,3]
s = Solution()
print(s.buildTree(inorder, postorder).levelOrder())
输出:
[3, 9, 20, None, None, 15, 7]
🌟 每日一练刷题专栏 🌟
✨ 持续,努力奋斗做强刷题搬运工!
👍 点赞,你的认可是我坚持的动力!
🌟 收藏,你的青睐是我努力的方向!
✎ 评论,你的意见是我进步的财富!
☸ 主页:https://hannyang.blog.csdn.net/
Golang每日一练 专栏 | |
Python每日一练 专栏 | |
C/C++每日一练 专栏 | |
Java每日一练 专栏 |