博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lintcode---线段树查询(区间最大值)
阅读量:7078 次
发布时间:2019-06-28

本文共 2014 字,大约阅读时间需要 6 分钟。

对于一个有n个数的整数数组,在对应的线段树中, 根节点所代表的区间为0-n-1, 每个节点有一个额外的属性max,值为该节点所代表的数组区间start到end内的最大值。

为SegmentTree设计一个 query 的方法,接受3个参数root, startend,线段树root所代表的数组中子区间[start, end]内的最大值。

 注意事项

在做此题之前,请先完成  这道题目。

样例

对于数组 [1, 4, 2, 3], 对应的线段树为:

[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]

query(root, 1, 1), return 4

query(root, 1, 2), return 4

query(root, 2, 3), return 3

query(root, 0, 2), return 4

 

思路:当遇到一些关于对连续点的修改和统计的问题时,可以考虑用线段树来解决。

     这属于典型的RMQ问题(区间最值查询问题),所以最好通过构建线段树,利用线段树的性质来求解,这样将问题转化成线段树,会让复杂度降低到log(n);
          
     还是要用递归的思路解决。先写出基准情形,然后递归解决。思路和上一篇博客求解给定区间元素个数一模一样。

     都是借助于线段树本身的性质,减小算法的时间复杂度。

 

/** * 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, start, end: The root of segment tree and      *                         an segment / interval     *@return: The maximum number in the interval [start, end]     */         /*    思路:当遇到一些关于对连续点的修改和统计的问题时,可以考虑用线段树来解决。          这属于典型的RMQ问题(区间最值查询问题),所以最好通过构建线段树,利用线段树的性质来求解!!          这样将问题转化成线段树,会让复杂度降低到log(n);                    还是要用递归的思路解决。先写出基准情形,然后递归解决。    */    int query(SegmentTreeNode *root, int start, int end) {        // write your code here                if(!root||start>end){            return 0;        }                if(root->start>=start&&root->end<=end){            return root->max;        }                int mid=root->start+(root->end-root->start)/2;                if(start>mid){            return query(root->right,start,end);        }        else if(end
left,start,end); } else return max(query(root->left,start,mid),query(root->right,mid+1,end)); }};

 

转载地址:http://rucml.baihongyu.com/

你可能感兴趣的文章
拇指接龙游戏从WIN32向Android移植过程问题记录(2)
查看>>
【转】【UNITY3D 游戏开发之七】C# 中的委托、事件、匿名函数、Lambda 表达式
查看>>
开源安全技术的四大好处
查看>>
LoadRunner在移动端性能测试的应用
查看>>
10月第1周安全回顾:严防漏洞攻击 注重隐私保护
查看>>
Hello JMX!
查看>>
MySQL作者Monty的回复:MariaDB 10可以跑生产环境
查看>>
Lync 小技巧-2-解决每次出现安装进度条的方法
查看>>
轻松学习Linux之认识Shell
查看>>
Golang之interface
查看>>
和之前的版本相比,昨天Release的Atlas Control Toolkit变化不可谓不大
查看>>
PowerPC VxWorks BSP分析(2)--PowerPC汇编
查看>>
CentOS6.5网络设置
查看>>
Mobile First! Wijmo 5 之 架构
查看>>
比较使用sql*loader的直接加载方式和传统加载方式的性能差异
查看>>
MongoDB复制集(Replication Sets)介绍
查看>>
javax.persistence.NoResultException: No entity found for query
查看>>
网络常见劫持杂谈
查看>>
Mysql完全备份
查看>>
使用Java窃取sina大片
查看>>