剑指 Offer 53 - I 至 55-II题解
Posted 风去幽墨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 53 - I 至 55-II题解相关的知识,希望对你有一定的参考价值。
剑指 Offer 53 - I. 在排序数组中查找数字 I
题意:
统计一个数字在排序数组中出现的次数。
题解:
二分查找,利用有序特性降低时间复杂度。
代码:
class Solution:
def search(self, nums: List[int], target: int) -> int:
l,r,ans = 0,len(nums)-1,0
while l<=r:
mid =(l+r)//2
if nums[mid]<target:
l=mid+1
elif nums[mid]>target:
r=mid-1
elif nums[mid]==target:
l,r=mid,mid
break
if l == r:
while l>=0 and nums[l]==target :
l,ans =l-1,ans+1
while r+1<len(nums) and nums[r+1]==target:
r,ans =r+1,ans+1
return ans
剑指 Offer 53 - II. 0~n-1中缺失的数字
题意:
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
题解:
利用有序性进行二分查找,可知正常情况下nums[i]==i,所以判断条件即为nums[mid] == mid,若是相等,则证明区间[l,mid]都是正常的,缺失部分在[mid+1,r],若不等,则证明缺失部分在[l,mid]。
代码:
class Solution:
def missingNumber(self, nums: List[int]) -> int:
l,r,ans = 0,len(nums)-1,-1
while l<=r:
mid = (l+r)//2
if nums[mid] ==mid:
l=mid+1
else:
r=mid-1
r=max(0,r)
for i in range(r,len(nums)):
if nums[i]!=i:
return i
return len(nums)
剑指 Offer 54. 二叉搜索树的第k大节点
题意:
给定一棵二叉搜索树,请找出其中第k大的节点。
题解:
深度优先搜索,也可以理解为中序遍历(右->根->左)
代码:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def kthLargest(self, root: TreeNode, k: int) -> int:
ans = 0
def dfs(rt:TreeNode):
nonlocal ans,k
if not rt:return
dfs(rt.right)
k-=1
if k==0:
ans = rt.val
dfs(rt.left)
dfs(root)
return ans
剑指 Offer 55 - I. 二叉树的深度
题意:
输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
题解:
树形dp。
dp[i]表示以i为根节点的树最大深度
转移方程:
dp[i]=max(dp[i.left],dp[i.right])+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 maxDepth(self, root: TreeNode) -> int:
if not root:return 0
return max(self.maxDepth(root.left),self.maxDepth(root.right))+1
剑指 Offer 55 - 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:
ans = True
def depth(root:TreeNode)->int:
nonlocal ans
if not root:return 0
l,r = depth(root.left),depth(root.right)
if max(l,r)-min(l,r)>1:
ans =False
return max(l,r)+1
depth(root)
return ans
以上是关于剑指 Offer 53 - I 至 55-II题解的主要内容,如果未能解决你的问题,请参考以下文章
乱序版 ● 剑指offer每日算法题打卡题解—— 搜索与回溯算法(题号 40,45,61)
乱序版 ● 剑指offer每日算法题打卡题解—— 查找算法 (题号3,4,11,53)
剑指 Offer 56 - I 至 56 - II 数组中数字出现的次数 I && II 题解