算法通关村第九关-白银挑战二分查找与高频搜索树

news2025/1/21 11:59:30

大家好我是苏麟,今天看看二分查找相关的题目 .

大纲

    • 二分查找拓展问题
      • 山脉数组的峰顶索引
    • 中序与搜索树
      • 二叉搜索树中的搜索
      • 验证二叉搜索树

二分查找拓展问题

山脉数组的峰顶索引

描述 :

符合下列属性的数组 arr 称为 山脉数组 :

  • arr.length >= 3
  • 存在 i(0 < i < arr.length - 1)使得:
    arr[0] < arr[1] < … arr[i-1] < arr[i]
    arr[i] > arr[i+1] > … > arr[arr.length - 1]

给你由整数组成的山脉数组 arr ,返回满足 arr[0] < arr[1] < … arr[i - 1] < arr[i] > arr[i + 1] > … > arr[arr.length - 1] 的下标 i

题目 :

LeetCode 852. 山脉数组的峰顶索引

852.山脉数组的封顶索引

在这里插入图片描述
分析 :

这个题其实就是前面找最小值的相关过程而已,最简单的方式是对数组进行一次遍历。

解析 :

class Solution {
    public int peakIndexInMountainArray(int[] arr) {
        int length = arr.length;
        int n = 0;
        for(int i = 0; i< length - 1;i++){
            if(arr[i] > arr[i + 1]){
                n = i;
                break;
            }
        }
        return n;
    }
}

分析 :

使用二分来优化一下

因为此题是必为高峰数组 , 所以数组长度为 时下标1为最大值 .

解析 :

class Solution {
    public int peakIndexInMountainArray(int[] arr) {
        int length = arr.length;
        if(length == 3){
            return 1;
        }
        int left = 1;
        int right = length - 1;
        while(left < right){
            int mid = (left + right) >>> 1;
            if(arr[mid - 1] < arr[mid] && arr[mid] < arr[mid + 1]){
                left = mid;
            }
            if(arr[mid - 1] > arr[mid] && arr[mid] > arr[mid + 1]){
                right = mid;
            }
            if(arr[mid - 1] < arr[mid] && arr[mid] > arr[mid + 1]){
                return mid;
            }
        }
        return left;
    }
}

中序与搜索树

在前面我们发现很多题使用前序、后序或者层次遍历都可以解决,但几乎没有中序遍历的。这是因为中序与前后序相比有不一样的特征,例如中序可以和搜索树结合在一起,但是前后序则不行。

二叉搜索树是一个很简单的概念,但是想说清楚却不太容易。简单来说就是如果一棵二叉树是搜索树,则按照中序遍历其序列正好是一个递增序列。比较规范的定义是:

  • 若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
  • 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
  • 它的左、右子树也分别为二又排序树。下面这两棵树一个中序序列是 {3.6.9,10,14,16,19},一个是{3,6,9,10},因此都是搜索树:
    在这里插入图片描述
    搜索树的题目虽然也是用递归,但是与前后序有很大区别,主要是因为搜索树是有序的,就可以根据条件决定某些递归就不必执行了,这也称为“剪枝”。

二叉搜索树中的搜索

描述 :

给定二叉搜索树(BST)的根节点 root 和一个整数值 val。
你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。

题目 :

LeetCode 700. 二叉搜索树中的搜索

700.二叉搜索树中的搜索
在这里插入图片描述
分析 :

本题看起来很复杂,但是实现非常简单,递归:

  • 如果根节点为空 root == null 或者根节点的值等于搜索值 val == root.val,返回根节点
  • 如果 val < root.val,进入根节点的左子树查找 searchBST(root.left, val)
  • 如果 val > root.val,进入根节点的右子树查找 searchBST(root.right, val)

解析 :

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode searchBST(TreeNode root, int val) {
        return searchNode(root,val);
    }
    public TreeNode searchNode(TreeNode root,int val){
        if(root == null){
           return null;
        }
        if(root.val == val){
            return root;
        }else{
            if(val < root.val){
               root = searchBST(root.left,val);
            }else{
                root =searchBST(root.right,val);
            }
        }
        return root;
    }
}

分析 :

迭代方式也很简单 , 只要值不相等就循环 , 循环到最后还没有就返回null .

解析 :

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode searchBST(TreeNode root, int val) {
        while(root != null && root.val != val){
           root = root.val > val ? root.left : root.right;
        }
        return root;
    }
}

验证二叉搜索树

描述 :

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  • 节点的左子树只包含 小于 当前节点的数
  • 节点的右子树只包含 大于 当前节点的数
  • 所有左子树和右子树自身必须也是二叉搜索树

题目 :

LeetCode 98. 验证二叉搜索树

验证二叉搜索树

在这里插入图片描述
分析 :

我们就以这个为例 :

在这里插入图片描述

以此代码为例讲解 :

class Solution {
    public boolean isValidBST(TreeNode root) {
        return is(root);
    }

    long pre = Long.MIN_VALUE;
    public boolean is(TreeNode root){
        if(root == null){
            return true;
        }
        if(root.val <= pre){
            return false;
        }
        pre = root.val;
        return is(root.right);
    }
}

第一步 :

定义变量 : long pre = Long.MIN_VALUE; 他的值为 -9223372036854775808 远远比 1 小 用来比较

第二步 :

用pre 和 root.val 比较 如果小于就返回false 否则就把root.val赋值给 pre , 最后传入节点root.right

第三步 :

以 root.right 为根节点继续比较

而下面这个代码是 递归左节点的 , 如果根节点的左节点不是二叉搜索树返回false

       if(!is(root.left)){
            return false;
        }

解析 :

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean isValidBST(TreeNode root) {
        return is(root);
    }

    long pre = Long.MIN_VALUE;
    public boolean is(TreeNode root){
        if(root == null){
            return true;
        }
        if(!is(root.left)){
            return false;
        }
        if(root.val <= pre){
            return false;
        }
        pre = root.val;
        return is(root.right);
    }
}

这期就到这里了 , 下期见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1215054.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【halcon】外观检测总结之灰度操作

1 灰度操作之 滞后延时 *滞后阈值 hysteresis_threshold (ImageInvert, RegionHysteresis, 190, 220, 3)这句话的意思就是&#xff0c;逐个判断这个图片区域里像素的灰度值&#xff0c;如果这个值小于190就不考虑了pass掉&#xff0c;如果大于220就直接入选。值在190和220之间…

企业商标信息查询API的优势和应用实例分析

前言 企业商标是企业在市场中的重要标识和竞争力的体现&#xff0c;而商标信息查询API则成为了企业品牌管理的重要工具。那么&#xff0c;这篇文章将详细阐述企业商标信息查询API的优势和应用实例分析。 企业商标信息API的优势 企业商标信息查询API的优势在于它可以快速、准…

通过Python脚本支持OC代码重构实践(三):数据项使用模块接入数据通路的适配

作者 | 刘俊启 导读 在软件开发中&#xff0c;经常会遇到一些代码问题&#xff0c;例如逻辑结构复杂、依赖关系混乱、代码冗余、不易读懂的命名等。这些问题可能导致代码的可维护性下降&#xff0c;增加维护成本&#xff0c;同时也会影响到开发效率。这时通常通过重构的方式对已…

还在为忘记BIOS密码担心?至少有五种方法可以重置或删除BIOS密码

忘记密码是一个我们都非常熟悉的问题。虽然在大多数情况下,只需单击“忘记密码”选项,然后按照几个简单的步骤即可恢复访问权限,但情况并非总是如此。忘记BIOS密码(通常为避免进入BIOS设置或避免个人计算机启动而设置的密码)意味着你将无法完全启动系统。 幸运的是,就像…

非对口专业测试人,婉拒猎头、放弃6份高薪offer,你敢信?

从非对口的国贸专业&#xff0c;步入测试之路&#xff1b;从红色旅游小城湘潭&#xff0c;迈入国际化都市上海。“明确方向-及时实践-谨慎选择-踏实扎根-计划未来”。她的每一步&#xff0c;都走得格外坚定有力......话不多说&#xff0c;让我们一起来看看这位小姐姐的成长故事…

揭秘2023年最热门的跨境电商源码趋势,你不能错过的关键信息

随着全球市场的不断扩大和国际贸易的加速&#xff0c;跨境电商源码正成为越来越多企业的首选。在本文中&#xff0c;我们将揭秘2023年跨境电商源码的最新趋势&#xff0c;为您带来关键信息&#xff0c;帮助您抓住机遇&#xff0c;实现商业成功。 2023年跨境电商源码趋势解析 …

JavaWeb-CSS

一、什么是CSS CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式表&#xff09;能够对网页中元素的位置排版进行精确的控制&#xff0c;拥有对网页对象和模型样式的编辑能力&#xff0c;简单来说就是页面美化。 CSS样式代码中的注释需要使用/**/。 二、CSS的引入方…

未来服务器操作系统的趋势与展望

摘要&#xff1a; 随着云计算、大数据和人工智能不断的发展&#xff0c;服务器操作系统也需要随之进行新一轮的升级。本文通过分析当前服务器操作系统的现状&#xff0c;探讨了未来服务器操作系统的趋势和展望&#xff0c;并针对一些关键问题提出了解决方案。 一、引言 服务器…

最全100种副业汇总,如果你没一份稳定的副业,那么要仔细看看了

为什么一定要有一份副业&#xff1f;三种人一定要有一份自己的副业&#xff0c;宝妈、大学生、死工资的上班族。因为有了一份优质的副业&#xff0c;您将不用依靠老公生活&#xff0c;您将不用向父母伸手要钱&#xff0c;您将不用时时刻刻看领导的颜色。 今天为大家总结了各类副…

折爱心教程(简单版本)

文章目录 1.折出双三角形2.向中心折叠3.形成正方形4.对折正反面相同5.向中心折6.外侧角向中心折7.顶部三角形向下折叠注意参考资料 我怎么也没有想到&#xff0c;身为混迹职场多年的老油子&#xff0c;竟然还能遇到折纸这种硬性task。 可是给的教程步骤省略太多了&#xff0c;看…

自动驾驶大模型,是怎么学习「世界知识」的?

近期&#xff0c;科技产业大佬不约而同地发出一个非常强烈的信号&#xff1a;自动驾驶走向完全的成熟&#xff0c;必须要被AI大模型重构。 中国工程院院士、清华大学教授、清华智能产业研究院&#xff08;AIR&#xff09;院长张亚勤认为&#xff0c;「自动驾驶是高度复杂的、最…

《QT从基础到进阶·二十九》QT,opencv源码调试

有时候我们在使用VS调试程序的bug&#xff0c;但发现程序崩溃的地方并不在我们写的程序中&#xff0c;我们通过调用堆栈发现程序崩溃的地方出现在QT或者opencv等源码中&#xff0c;那么我们怎么能把断点打到这些开源库中&#xff0c;下面提供一种办法&#xff1a; 解决方案–右…

老哥们平日是怎么排查线上问题的?

1、做好监控告警 如果线上出现了问题&#xff0c;我们更多的是希望由监控告警发现我们出了线上问题&#xff0c;而不是等到业务侧反馈。所以&#xff0c;我们需要对核心接口做好监控告警的功能。 2、定位报警层面 如果是业务代码层面的监控报警&#xff0c;那我们应该是可以…

2023 年 数维杯(C题)国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析

问题重述 信息技术和人工智能的迅速发展&#xff0c;特别关注大型语言模型&#xff08;Large Language Models&#xff0c;LLMs&#xff09;在全球范围内的广泛应用&#xff0c;以ChatGPT为代表。这些模型在机器人导航、语音识别、图像识别、自然语言处理和智能推荐等领域表现…

Dread Hunger恐惧饥荒服务器宣布关服

Dread Hunger恐惧饥荒服务器宣布关服 大家好我是艾西&#xff0c;如果不是被逼无奈 谁不喜欢在自己的舒适圈待着呢.从2022年年初到2023年下半年有太多的记忆了从最开始的当狼激动开心到后面慢慢的变成了一种恐惧&#xff0c;从最开始的变态花活变成了只要赢就行逐渐麻木了 作为…

Ubuntu 安装VMware Tools选项显示灰色,如何安装VMware Tools

只要你的网络没问题&#xff0c;你直接执行这几个命令&#xff0c;重启ubuntu虚拟机即可、 sudo dpkg --configure -a sudo apt-get autoremove open-vm-tools sudo apt-get install open-vm-tools sudo apt-get install open-vm-tools-desktop

苹果电脑录屏快捷键,让你成为录屏达人

“苹果电脑录屏好麻烦呀&#xff0c;操作步骤很繁琐&#xff0c;有人知道苹果电脑怎么快速录屏呀&#xff0c;要是有快捷键就更好了&#xff0c;大家知道苹果电脑有录屏快捷键吗&#xff1f;谢谢啦&#xff01;” 苹果电脑以其直观的用户界面和卓越的性能而闻名&#xff0c;而…

MES选型注意事项

1、明确需求和边界 企业首先要明确需要MES哪些模块及要实现的目标&#xff0c;如实现质量透明化、设备状态管理、IPQC检验管理等。MES通常要与其他系统集成&#xff0c;如与ERP集成&#xff0c;要事先明确哪些在ERP中做&#xff0c;哪些在MES中做&#xff0c;哪些需要同步。 车…

java VR全景商城免费搭建 saas商城 b2b2c商城 o2o商城 积分商城 秒杀商城 拼团商城 分销商城 短视频商城

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

普源DS1052E固件升级【附所有升级固件及工具】

折腾了两天&#xff0c;总算是弄好了。 升级的目的是啥&#xff1f;DS1052E的带宽是50M&#xff0c;示波器的时基最小可以调到5ns。固件升级后示波器的时基最小可以调到2ns&#xff0c;理论上说明此时示波器的带宽是100M。 网上的方法能找到很多&#xff0c;我总结一下大概的流…