1208
题目描述:
给你两个长度相同的字符串,s 和 t。
将 s 中的第 i 个字符变到 t 中的第 i 个字符需要 |s[i] - t[i]| 的开销(开销可能为 0),也就是两个字符的 ASCII 码值的差的绝对值。
用于变更字符串的最大预算是 maxCost。在转化字符串时,总开销应当小于等于该预算,这也意味着字符串的转化可能是不完全的。
如果你可以将 s 的子字符串转化为它在 t 中对应的子字符串,则返回可以转化的最大长度。
如果 s 中没有子字符串可以转化成 t 中对应的子字符串,则返回 0。
示例:
解答:
class Solution:
def equalSubstring(self, s: str, t: str, maxCost: int) -> int:
left = right = 0
res = 0
n = len(s)
tmpcost = 0
while right < n:
tmpcost += abs(ord(s[right])-ord(t[right]))
if tmpcost > maxCost:
tmpcost -= abs(ord(s[left])-ord(t[left]))
left += 1
right += 1
res = max(res, right - left)
return res
剑指offer07
题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
示例:
解答:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
if not preorder:
return None
loc=inorder.index(preorder[0])
root=TreeNode(preorder[0])
root.left=self.buildTree(preorder[1:loc+1],inorder[:loc])
root.right=self.buildTree(preorder[loc+1:],inorder[loc+1:])
return root
剑指offer55-I
题目描述:
输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
示例:
解答:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def maxDepth(self, root: TreeNode) -> int:
if not root:
return 0
if not root.left and not root.right:
return 1
L=self.maxDepth(root.left)+1
R=self.maxDepth(root.right)+1
return max(L,R)
剑指offer55-II
题目描述:
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
示例:
解答:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def isBalanced(self, root: TreeNode) -> bool:
return self.treeHeight(root)>=0
def treeHeight(self,root):
if not root:
return 0
leftHeight=self.treeHeight(root.left)
rightHeight=self.treeHeight(root.right)
if leftHeight>=0 and rightHeight>=0 and abs(leftHeight-rightHeight)<=1:
return max(leftHeight,rightHeight)+1
else:
return -1
剑指offer57-II
题目描述:
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
示例:
解答:
class Solution:
def findContinuousSequence(self, target: int) -> List[List[int]]:
res=[]
l,r=1,2
while l<r:
a=[]
sum=(l+r)*(r-l+1)/2
if sum<target:
r+=1
elif sum>target:
l+=1
else:
for i in range(l,r+1):
a.append(i)
res.append(a)
l+=1
r+=1
return res