LeetCode 270:在二叉搜索树中寻找最接近的值(Swift 实战解析)

在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

在日常开发中,我们经常需要在一组有序的数据中快速找到最接近某个目标值的元素。LeetCode 第 270 题“Closest Binary Search Tree Value”正是这样一个问题。本文将深入解析该题,提供 Swift 语言的解题方案,并通过详细的代码分析和实际示例,帮助您掌握在二叉搜索树中高效查找最接近目标值的技巧。

描述

给定一个非空的二叉搜索树(BST)和一个目标值 target,找到 BST 中最接近 target 的值。如果有多个值同样接近 target,返回较小的那个。

示例:

输入:

root = [4,2,5,1,3], target = 3.714286

输出:

4

提示:

  • 目标值是一个浮点数。

  • 保证 BST 中只有一个最接近目标值的节点。

题解答案

我们可以利用二叉搜索树的特性,从根节点开始,根据目标值与当前节点值的大小关系,决定向左子树还是右子树搜索,同时记录当前最接近目标值的节点。

class Solution {func closestValue(_ root: TreeNode?, _ target: Double) -> Int {var closest = root!.valvar current = rootwhile let node = current {if abs(Double(node.val) - target) < abs(Double(closest) - target) {closest = node.val}if target < Double(node.val) {current = node.left} else {current = node.right}}return closest}
}

题解代码分析

这段代码的核心思想是利用 BST 的性质进行二分搜索:

  1. 初始化:将 closest 初始化为根节点的值,current 指向根节点。

  2. 遍历:在遍历 BST 的过程中,比较当前节点的值与目标值的差距,如果更接近目标值,则更新 closest

  3. 方向选择:根据目标值与当前节点值的大小关系,决定向左子树还是右子树继续搜索。

这种方法的优势在于,它不需要遍历整个树,而是根据 BST 的特性,有选择地遍历部分节点,从而提高效率。

示例测试及结果

我们可以通过以下示例来测试上述代码的正确性:

// 构建示例 BST
let root = TreeNode(4)
root.left = TreeNode(2)
root.right = TreeNode(5)
root.left?.left = TreeNode(1)
root.left?.right = TreeNode(3)// 创建 Solution 实例
let solution = Solution()// 测试
let result = solution.closestValue(root, 3.714286)
print("最接近的值是:\(result)") // 输出:4

在这个示例中,BST 的结构如下:

    4/ \2   5/ \
1   3

目标值为 3.714286,最接近的节点值是 4。

时间复杂度

  • 最坏情况:O(n),当 BST 退化为链表时,需要遍历所有节点。

  • 平均情况:O(log n),在平衡 BST 中,每次比较后可以排除一半的节点。

空间复杂度

  • O(1),只使用了常数级别的额外空间。

总结

通过利用二叉搜索树的特性,我们可以高效地找到最接近目标值的节点。这种方法在处理有序数据结构时非常有用,特别是在需要快速查找接近某个值的元素时。在实际开发中,例如在推荐系统中查找最接近用户兴趣的内容,或在地图应用中查找最近的地点,都可以应用类似的思想。

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

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

相关文章

Kotlin高阶函数多态场景条件判断与子逻辑

Kotlin高阶函数多态场景条件判断与子逻辑 fun main() {var somefun: (Int, Float) -> Longval a 4val b 5fsomefun multi()//if 某条件println(somefun.invoke(a, b))//if 某条件somefun add()println(somefun.invoke(a, b)) }fun multi(): (Int, Float) -> Long {re…

嵌入式学习--江协51单片机day4

昨天周五没有学习&#xff0c;因为中午没有睡觉&#xff0c;下午和晚上挤不出整块的时间。周日有考试今天也没有学很多啊&#xff0c;但以后周末会是学一天&#xff0c;另一天休息和写周总结。 今天学了串口通信和LED点阵屏&#xff0c;硬件原理是真的很迷&#xff0c;一但想搞…

Spring Cloud 以Gateway实现限流(自定义返回内容)

前言 Spring Cloud Gateway自带RequestRateLimiterGatewayFilterFactory限流方案&#xff0c;可基于Redis和RedisRateLimiter实现默认算法为令牌桶的请求限流。作为自带的该限流方案&#xff0c;其可与Spring生态的其它各项组件无缝集成&#xff0c;并且自身实现也相对完善/好用…

容器填充函数fill和memset对比总结

文章目录 1、fill() 按元素填充2、memset() 按字节填充3、对比 1、fill() 按元素填充 用于将容器或数组的指定范围内的元素赋值为指定值&#xff08;按元素类型填充&#xff09;。属于 C STL 算法&#xff08;<algorithm> 头文件&#xff09;。 // 从起始地址到结束地址…

【Linux实践系列】:进程间通信:万字详解共享内存实现通信

&#x1f525; 本文专栏&#xff1a;Linux Linux实践项目 &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 人生就像一场马拉松&#xff0c;重要的不是起点&#xff0c;而是坚持到终点的勇气 ★★★ 本文前置知识&#xff1a; …

CogView4 文本生成图像

CogView4 文本生成图像 flyfish 基于 CogView4Pipeline 的图像生成程序&#xff0c;其主要目的是依据 JSON 文件里的文本提示信息来生成图像&#xff0c;并且把生成的图像保存到指定文件夹。 JSON 文件格式 [{"prompt": "your first prompt"},{"pr…

路由重发布

路由重发布 实验目标&#xff1a; 掌握路由重发布的配置方法和技巧&#xff1b; 掌握通过路由重发布方式实现网络的连通性&#xff1b; 熟悉route-pt路由器的使用方法&#xff1b; 实验背景&#xff1a;假设学校的某个分区需要配置简单的rip协议路由信息&#xff0c;而主校…

机器人领域和心理学领域 恐怖谷 是什么

机器人领域和心理学领域 恐怖谷 是什么 恐怖谷是一个在机器人领域和心理学领域备受关注的概念,由日本机器人专家森政弘于1970年提出。 含义 当机器人与人类的相似度达到一定程度时,人类对它们的情感反应会突然从积极变为消极,产生一种毛骨悚然、厌恶恐惧的感觉。这种情感…

Go-GJSON 组件,解锁 JSON 读取新姿势

现在的通义灵码不但全面支持 Qwen3&#xff0c;还支持配置自己的 MCP 工具&#xff0c;还没体验过的小伙伴&#xff0c;马上配置起来啦~ https://click.aliyun.com/m/1000403618/ 在 Go 语言开发领域&#xff0c;json 数据处理是极为常见的任务。Go 标准库提供了 encoding/jso…

数据分析_数据预处理

1 数据预处理流程 ①数据清洗:处理数据缺失、数据重复、数据异常等问题,提升数据质量. ②数据转换:涵盖基本数据转换、语义数据转换、衍生数据转换和隐私数据转换,适配分析需求. ③数据集成:整合多源数据. 2 数据清洗 2.1 数据缺失 2.1.1 数值型数据缺失 数值型列的部分数值不…

vue +xlsx+exceljs 导出excel文档

实现功能&#xff1a;分标题行导出数据过多&#xff0c;一个sheet表里表格条数有限制&#xff0c;需要分sheet显示。 步骤1:安装插件包 npm install exceljs npm install xlsx 步骤2&#xff1a;引用包 import XLSX from xlsx; import ExcelJS from exceljs; 步骤3&am…

ThinkPad T440P如何从U盘安装Ubuntu24.04系统

首先制作一个安装 U 盘。我使用的工具是 Rufus &#xff0c;它的官网是 rufus.ie &#xff0c;去下载最新版就可以了。直接打开这个工具&#xff0c;选择自己从ubuntu官网下载Get Ubuntu | Download | Ubuntu的iso镜像制作U盘安装包即可。 其次安装之前&#xff0c;还要对 Thi…

第十七次博客打卡

今天学习的内容是动态规划算法。 动态规划算法&#xff08;Dynamic Programming&#xff0c;简称 DP&#xff09;是一种通过将复杂问题分解为更小的子问题来求解的算法思想。它主要用于解决具有重叠子问题和最优子结构特性的问题。 一、动态规划的基本概念 1. 最优子结构 一个复…

视觉革命来袭!ComfyUI-LTXVideo 让视频创作更高效

探索LTX-Video 支持的ComfyUI 在数字化视频创作领域&#xff0c;视频制作效果的提升对创作者来说无疑是一项重要的突破。LTX-Video支持的ComfyUI便是这样一款提供自定义节点的工具集&#xff0c;它专为改善视频质量、提升生成速度而开发。接下来&#xff0c;我们将详细介绍其功…

Java版ERP管理系统源码(springboot+VUE+Uniapp)

ERP系统是企业资源计划&#xff08;Enterprise Resource Planning&#xff09;系统的缩写&#xff0c;它是一种集成的软件解决方案&#xff0c;用于协调和管理企业内各种关键业务流程和功能&#xff0c;如财务、供应链、生产、人力资源等。它的目标是帮助企业实现资源的高效利用…

CenOS7切换使用界面

永久切换 在开始修改之前&#xff0c;我们首先需要查看当前的启动模式。可以通过以下命令来实现&#xff1a; systemctl get-default执行此命令后&#xff0c;系统会返回当前的默认启动模式&#xff0c;例如graphical.target表示当前默认启动为图形界面模式。 获取root权限&…

Dify使用总结

最近完成了一个Dify的项目简单进行总结下搭建服务按照官方文档操作就行就不写了。 进入首页之后由以下组成&#xff1a; 探索、工作室、知识库、工具 探索&#xff1a; 可以展示自己创建的所有应用&#xff0c;一个应用就是一个APP&#xff0c;可以进行测试使用 工作室包含…

计网学习笔记———网络

&#x1f33f;网络是泛化的概念 网络是泛化的概念 &#x1f342;泛化理解 网络的概念在生活中无处不在举例&#xff1a;社交网络、电话网路、电网、计算机网络 &#x1f33f;网络的定义 定义&#xff1a; 离散的个体通过通讯手段连成群体&#xff0c;实现资源的共享与交流、个…

《Python星球日记》 第53天:卷积神经网络(CNN)入门

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、图像表示与通道概念1. 数字图像的本质2. RGB颜色模型3. 图像预处理 二、卷积…

SpringBoot2集成xxl-job详解

官方教程 搭建调度中心 Github Gitee 注&#xff1a;版本3.x开始要求Jdk17&#xff1b;版本2.x及以下支持Jdk1.8。如对Jdk版本有诉求&#xff0c;可选择接入不同版本 clone源代码执行xxl-job\doc\db\tables_xxl_job.sql # # XXL-JOB v2.4.1 # Copyright (c) 2015-present, x…