剑指 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值