剑指 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 题解

剑指 Offer 56 - I 至 56 - II 数组中数字出现的次数 I && II 题解

剑指 Offer 57 至 58 - II 题解

剑指 Offer 57 至 58 - II 题解