LintCode 202. Segment Tree Query (线段树经典题!)

2023-11-03

  1. Segment Tree Query
    中文English
    For an integer array (index from 0 to n-1, where n is the size of this array), in the corresponding SegmentTree, each node stores an extra attribute max to denote the maximum number in the interval of the array (index from start to end).

Design a query method with three parameters root, start and end, find the maximum number in the interval [start, end] by the given root of segment tree.

Example 1:
For array [1, 4, 2, 3], the corresponding Segment Tree is:

Input:"[0,3,max=4][0,1,max=4][2,3,max=3][0,0,max=1][1,1,max=4][2,2,max=2][3,3,max=3]",1,2
Output:4
Explanation:
For array [1, 4, 2, 3], the corresponding Segment Tree is :

	                  [0, 3, max=4]
	                 /             \
	          [0,1,max=4]        [2,3,max=3]
	          /         \        /         \
	   [0,0,max=1] [1,1,max=4] [2,2,max=2], [3,3,max=3]
The maximum value of [1,2] interval is 4

Input:query(root, 1, 1), Output:4

Input:query(root, 1, 2), Output:4

Input:query(root, 2, 3), Output:5

Input:query(root, 0, 2), Output:4

Example 2:

Input:"[0,3,max=4][0,1,max=4][2,3,max=3][0,0,max=1][1,1,max=4][2,2,max=2][3,3,max=3]",2,3
Output:3
Explanation:
For array [1, 4, 2, 3], the corresponding Segment Tree is :

	                  [0, 3, max=4]
	                 /             \
	          [0,1,max=4]        [2,3,max=3]
	          /         \        /         \
	   [0,0,max=1] [1,1,max=4] [2,2,max=2], [3,3,max=3]
The maximum value of [2,3] interval is 3

Notice
It is much easier to understand this problem if you finished Segment Tree Build first.

解法1:递归。
注意:

  1. mid必须以root->start和root->end为准,而不是start和end为准。因为线段树就是根据root->start和root->end来划分的。
  2. start和end都是与mid比较,而不是与root->start和root->end比较。
/**
 * Definition of SegmentTreeNode:
 * class SegmentTreeNode {
 * public:
 *     int start, end, max;
 *     SegmentTreeNode *left, *right;
 *     SegmentTreeNode(int start, int end, int max) {
 *         this->start = start;
 *         this->end = end;
 *         this->max = max;
 *         this->left = this->right = NULL;
 *     }
 * }
 */

class Solution {
public:
    /**
     * @param root: The root of segment tree.
     * @param start: start value.
     * @param end: end value.
     * @return: The maximum number in the interval [start, end]
     */
    int query(SegmentTreeNode * root, int start, int end) {
        if (!root) return 0;
        
        if (start <= root->start && end >= root->end) return root->max;
        int mid = root->start + (root->end - root->start) / 2;
        int result = 0;
        if (start <= mid) {
            result = max(result, query(root->left, start, min(mid, end)));
        }
        if (mid + 1 <= end) {
            result = max(result, query(root->right, max(mid + 1, start), end));            
        }
        
        return result;
    }
};

解法2:和解法1类似。参考九章。
区别就是这里查询的start和end一直都没变。为什么可以不变呢?因为最终递归时,比如说选左区间,如果start在左区间,end超出了左区间,那么最终左区间又会继续递归。假如start<新左区间的mid,则继续递归query start和新左区间的左区间,以及新左区间的右区间,而后者已经在[start,end]范围内。

class Solution {
public:
    /**
     * @param root: The root of segment tree.
     * @param start: start value.
     * @param end: end value.
     * @return: The maximum number in the interval [start, end]
     */
    int query(SegmentTreeNode * root, int start, int end) {
        if (!root) return 0;
        
        if (start <= root->start && end >= root->end) return root->max;
        int mid = root->start + (root->end - root->start) / 2;
        int result = 0;
        if (start <= mid) {
            result = max(result, query(root->left, start, end));
        }
        if (mid + 1 <= end) {
            result = max(result, query(root->right, start, end));            
        }
        
        return result;
    }
};

另外,根据链接:https://blog.csdn.net/weixin_55516868/article/details/128717574
前缀和数组、差分数组、线段树、树状数组均用于处理区间问题,但有不同应用场景

前缀和数组:用于处理 连续多次取区间和 操作的情况,取区间和期间不能对原数组进行区间增减数操作

差分数组:用于处理 多次区间增减数操作,最后读取一次区间和(即修改期间读取不频繁) 操作的情况
线段树:用于处理 多次区间增减数操作,期间多次读取区间和(即修改期间读取频繁) 操作的情况
树状数组:用于处理 多次区间增减数操作,期间多次读取区间和(即修改期间读取频繁) 操作的情况,同线段树的情况、但树状数组更加简单且不支持区间更新,线段树支持区间更新但编码复杂

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LintCode 202. Segment Tree Query (线段树经典题!) 的相关文章

  • 【Unity插件】最多的插件合集

    一 前言 最近整理了一下文章 发现我分享了很多的插件 但是如果要查找某一款插件 还需要去搜索才能找到 很不方面 就想要将写过的所有的插件分享也好 教程也好 做一个汇总 然后这篇文章还会不断的更新 在有新的插件之后 熟悉我的人都知道 我对插件
  • python 逆向

    1 目标网址 https www qimingpian com finosda project pinvestment 2 抓包查看响应体 3 数据加密 4 打上断电进行调试 5 抠出代码进行运行 6 总结 function o t 就是我
  • shell sed过滤器详解

    1 Sed简介sed 是一种在线编辑器 它一次处理一行内容 处理时 把当前处理的行存储在临时缓冲区中 称为 模式空间 pattern space 接着用sed命令处理缓冲区中的内容 处理完成后 把缓冲区的内容送往屏幕 接着处理下一行 这样不
  • 怎么维护自己的电脑

    文章目录 我的电脑 日常维护措施 维护技巧 键盘 屏幕清洁 清理磁盘空间 控制温度 电脑换电池 无论是学习还是工作 电脑都是IT人必不可少的重要武器 一台好电脑除了自身配置要经得起考验 后期主人对它的维护也是决定它寿命的重要因素 你日常是怎
  • 开讲啦!0基础也能玩转飞桨开源社区

    作为cs ai学生 你是否经历过这些至暗时刻 希望快速入门深度学习 无奈网上到处都是看不懂 黑话 一遍遍计算综测小数点后四位 不断在保研边缘反复横跳 看着 洁白如新 的履历叹气 一听到 考研复试 就头皮发麻 0实习 的标签在求职时毫无竞争力
  • 主变压器新装或大修后投入运行为什么有时气体继电器会频繁动作?遇到此类问题怎样判断和处理?

    主变压器新装或大修后投入运行为什么有时气体继电器会频繁动作 遇到此类问题怎样判断和处理 答 新装或大修的变压器在加油 滤油时 会将空气带入变压器内部 若没有能够及时排出 则当变压器运行后油温会逐渐上升 形成油的对流 将内部贮有的空气逐渐排除
  • 个人信息可携带权的中国路径(线上)研讨会

    个人信息保护法 将于今年11月1日正式实施 其中首次提出了个人信息可携带权的相关法条 体现了将个人信息权利还于个人的立法思路 也为进一步释放数据要素生产力带来了新的历史机遇 为深入了解个人信息可携带权在全球范围的发展及在中国的可行落地路径
  • lstm(三) 模型压缩lstmp

    lstmp结构 对于传统的lstm而言 i t W i
  • Linux专栏(二):创建虚拟机与Ubuntu安装

    文章目录 1 下载Ubuntu20 04镜像 2 创建虚拟机 3 安装Ubuntu系统 本文将介绍在VMware中如何创建虚拟机并安装Ubuntu20 04系统 1 下载Ubuntu20 04镜像 下载地址 Ubuntu官网镜像下载 2 创
  • 复旦NLP团队发布80页大模型Agent综述,一文纵览AI智能体的现状与未来

    来源 机器之心 智能体会成为打开 AGI 之门的钥匙吗 复旦 NLP 团队全面探讨 LLM based Agents 近期 复旦大学自然语言处理团队 FudanNLP 推出 LLM based Agents 综述论文 全文长达 86 页 共

随机推荐

  • block(块),page(页),buffer cache(块缓冲)区别与联系

    在自己的理解里 块就是用来管理磁盘空间的 就像我们在给一个磁盘建立文件系统时候 我们可以指定block size 而页是针对内存管理 例如从磁盘读出的数据就缓存在内存页中 但突然对关buffer cache block buffer 这些东
  • vue项目实现搜索功能

    使用vue框架实现以下要求 1 点击 首页 顶部搜索框 通过路由跳转到搜索页 并实现关键字模糊搜索功能 2 搜索页和首页下面用到的JSON数据自行模拟 并正确搜索渲染出来 3 在搜索页保留每次的搜索历史关键字 在搜索页的 历史搜索 中显示出
  • 微信小程序wx.request 使用 post方式传参

    参考网址 https blog csdn net lengxin337 article details 78234503 重点注意 method 是 get 方式的时候 header为 Content Type application js
  • 产品不快,你就死定了!

    作者碎碎念 创业团队做产品要拼迭代速度 天下武功 唯快不破 扎克伯格说 不酷 你就死定了 我要套用他的话说 不快 你就死定了 因为太阳底下没有新鲜事 聪明人辣么多 凭空想出一个绝世好点子 你没戏的 但是 发现别人做得不足的地方 再迅速赶超
  • java.net.SocketException:Connection reset

    背景 HttpClient远程调用HTTPS的API时 报错java net SocketException Connection reset 原因 Jdk版本差异导致的异常 由于Jdk1 7默认的是TLS的协议版本是v1 0 而Jdk1
  • C++工厂模式总结-简易版反射

    设计模式之factory method与c 反射 记我曾经的误解 Factory Method的官方解释是 Define an interface for creating an object but let subclasses deci
  • c++ 拷贝构造函数_C++构造函数总结

    最近在找工作 比较忙 所以没有时间写文章了 找了一段时间了 还是没有什么收获 找工作给我一个最大的体会就是 基础要扎实 代码能力要强 这里的代码不是指那种业务逻辑的代码哦 01 文章概要 这篇文章总结一下C 中的构造函数 然后自己实现一个M
  • SQL Server 数据库——第三章课后题

    习题 3 SQL表达式 4 SQL语句建立第2章习题6中4个表 5 针对习题4中的4个表试用SQL完成以下各项操作 9 请为三建工程项目建立一个供应情况的视图 心得 3 SQL表达式 SELECT FROM S WHERE A 10 SEL
  • IPv6 vs IPv4使用差异说明

    1 IPv6 vs IPv4使用差异说明 1 1 约束限制 chrony支持全局地址 global address 不支持链路本地地址 link local address Firefox支持通过http https协议访问全局地址 glo
  • 微信分享链接出现config:invalid signature错误的解决方法

    当开发微信时需要做特定的页面做分享时 根据官方提供的jssdk php文件创建的签名数据包调试时 大家碰到的最多的错误而且解决最麻烦的大概就是signature错误了 如下图 分享时提示错误 errMsg config invalid si
  • JSP中的内置对象pageContext的作用

    1 当作当前页面域对象使用 2 可以获取到jsp中其他8个内置对象 jsp中其实可以直接用其他内置对象 但再el表达式中可以尝试使用 因为request response session servletContext servletConf
  • 小程序-报错 xxx is not defined (已解决)

    小程序 报错 xxx is not defined 已解决 问题情境 这样一段代码 微信的小程序报错 is not defined 我 wxml 想这样调用 wxml 代码
  • 力扣每日一题【用户分组】

    题目链接 用户分组 视频连接 用户分组 C 代码 class Solution public vector
  • CTO六大能力模型

    一个公司的CTO面临着许多难题和尴尬处境 他们整天忙得焦头烂额 跟CEO肩并肩共同应对各种困难 他们跟其它高管紧密配合 提供强大的技术后盾 他们不断学习新技术 制定符合企业的技术战略 想要成为一名优秀的CTO 究竟要具备哪些方面的能力素质
  • 如何评估大型语言模型(LLM)?

    编者按 近期几乎每隔一段时间 就有新的大语言模型发布 但是当下仍然没有一个通用的标准来评估这些大型语言模型的质量 我们急需一个可靠的 综合的LLM评估框架 本文说明了为什么我们需要一个全面的大模型评估框架 并介绍了市面上这些现有的评估框架
  • 地址解析协议 (ARP)

    地址解析协议 ARP 是互联网协议 IP 套件的关键第 2 层协议 可将 IP 地址转换为媒体访问控制 MAC 地址 IP MAC ARP 在实现网络连接方面发挥着不可或缺的作用 能够发现本地网络上设备的硬件地址并将其映射到其 IP 地址
  • STM32F429 不断重复复位

    之前做过一块STM32F429的板子 板子搭载SDRAM和NAND flash 刚开始板子还是好好的 用了一段时间之后 板子变得很奇怪 开机后SDRAM和NAND初始化之后 运行SDRAM的测试代码 大概运行10S左右就会出现一次复位 我在
  • html设置一段文字颜色,用span css设置div内部分字体颜色

    用span标签设置div内放一段文字中的一小部分文字字体色采方式 一段笔墨放在DIV内或P内 当咱们配置div或p设置字体色彩 内里全体笔墨的字体色调就会变成咱们所配置字体色彩 通常会结构一段翰墨中个中几个字或一小块字的字体色采不同 此时就
  • Hibernate学习(2)- hibernate.cfg.xml详解

    1 主配置文件主要分为三部分 注意 通常情况下 一个session factory节点代表一个数据库 1 1 第一部分 数据库连接部分 注意 hibernate connection driver class 中间的 1 2 第二部分 其他
  • LintCode 202. Segment Tree Query (线段树经典题!)

    Segment Tree Query 中文English For an integer array index from 0 to n 1 where n is the size of this array in the correspon