lintcode-205-区间最小数
205-区间最小数
给定一个整数数组(下标由 0 到 n-1,其中 n 表示数组的规模),以及一个查询列表。每一个查询列表有两个整数 [start, end]。 对于每个查询,计算出数组中从下标 start 到 end 之间的数的最小值,并返回在结果列表中。
注意事项
在做此题前,建议先完成以下三道题 线段树的构造, 线段树的查询 及 线段树的修改。
样例
对于数组 [1,2,7,8,5], 查询 [(1,2),(0,4),(2,4)],返回 [2,1,5]
挑战
每次查询在O(logN)的时间内完成
标签
二分法 LintCode 版权所有 线段树
思路
这里需要用上 lintcode-201-线段树的构造 和 lintcode-202-线段树的查询,不过需要注意的是,这里求得是最小值,所以需要将线段树代码略作修改,原先 SegmentTreeNode 类中的 max 现在表示的是在区间 [start, end] 的最小元素值
code
/**
* Definition of Interval:
* class Interval{
* int start, end;
* Interval(int start, int end) {
* this->start = start;
* this->end = end;
* }
* };
*/
class Solution {
public:
/**
*@param A, queries: Given an integer array and an query list
*@return: The result list
*/
vector<int> intervalMinNumber(vector<int> &A, vector<Interval> &queries) {
// write your code here
if (A.empty() || queries.empty()) {
return vector<int>();
}
vector<int> result;
SegmentTreeNode * root = build(0, A.size() - 1, A);
for (int i = 0; i < queries.size(); i++) {
result.push_back(query(root, queries[i].start, queries[i].end));
}
return result;
}
SegmentTreeNode * build(int start, int end, vector<int> &nums) {
// write your code here
if (start > end) {
return nullptr;
}
SegmentTreeNode *root = new SegmentTreeNode(start, end, 0);
if (start != end) {
root->left = build(start, (start + end) / 2, nums);
root->right = build((start + end) / 2 + 1, end, nums);
root->max = min(root->left->max, root->right->max);
}
else {
root->max = nums[start];
}
return root;
}
int query(SegmentTreeNode *root, int start, int end) {
// write your code here
int mid = (root->start + root->end) / 2;
if (start <= root->start && end >= root->end) {
return root->max;
}
else if (mid < start) {
return query(root->right, start, end);
}
else if (mid + 1 > end) {
return query(root->left, start, end);
}
else {
return min(query(root->left, start, mid), query(root->right, mid + 1, end));
}
}
};
lintcode-205-区间最小数的更多相关文章
- CF484E Sign on Fence
题意 给定一个长度为n的数列,有m次询问,询问形如l r k 要你在区间[l,r]内选一个长度为k的区间,求区间最小数的最大值 Sol 二分答案 怎么判定,每种数字开一棵线段树 某个位置上的数大于等于 ...
- lintcode-391-数飞机
391-数飞机 给出飞机的起飞和降落时间的列表,用 interval 序列表示. 请计算出天上同时最多有多少架飞机? 注意事项 如果多架飞机降落和起飞在同一时刻,我们认为降落有优先权. 样例 对于每架 ...
- Lintcode---区间求和 I
给定一个整数数组(下标由 0 到 n-1,其中 n 表示数组的规模),以及一个查询列表.每一个查询列表有两个整数 [start, end] . 对于每个查询,计算出数组中从下标 start 到 end ...
- SCUT - 299 - Kaildls的数组划分 - dp - 高精
https://scut.online/p/299 \(dp[i][k]\) 为前 \(i\) 个数分 \(k\) 组的最大值,那么 $dp[i][k]=max_{p=1}^{i-1}{dp[p][k ...
- Sign on Fence CodeForces - 484E
http://codeforces.com/problemset/problem/484/E 题意: 给定一个长度为n的数列,有m次询问,询问形如l r k 要你在区间[l,r]内选一个长度为k的区间 ...
- Uva 1609 Feel Good
题面:给出长度为n的数列,然后算出其区间和乘区间最小数所能得到的最大值,并且输出区间 样例输入: 6 3 1 6 4 5 2 样例输出: 60 3 5 原题链接:https://vjudge.net/ ...
- [LeetCode] 877. Stone Game == [LintCode] 396. Coins in a Line 3_hard tag: 区间Dynamic Programming, 博弈
Alex and Lee play a game with piles of stones. There are an even number of piles arranged in a row, ...
- CodeForces - 840D:(主席树求出现区间出现次数大于某值的最小数)
Once, Leha found in the left pocket an array consisting of n integers, and in the right pocket q que ...
- LintCode 30插入区间
问题 给出一个无重叠的按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 样例 插入区间[2, 5] 到 [[1,2], ...
- lintcode: search for a range 搜索区间
题目 搜索区间 给定一个包含 n 个整数的排序数组,找出给定目标值 target 的起始和结束位置. 如果目标值不在数组中,则返回[-1, -1] 样例 给出[5, 7, 7, 8, 8, 10]和目 ...
随机推荐
- nodejs知识点
rss(resident set size):所有内存占用,包括指令区和堆栈. heapTotal:”堆”占用的内存,包括用到的和没用到的. heapUsed:用到的堆的部分. external: V ...
- Python学习:18.Python异常处理
一.为什么使用异常处理 当程序运行的时候出现了异常,导致程序终止运行,为了解决这种情况,我们需要预先对可能出现的异常进行处理,一旦出现这种异常,就使用另一种方式解决问题,还有就是错误信息是使用者没有必 ...
- windows提权之前的信息收集
0x00 基本信息 -获取主机名:hostname或者echo %COMPUTERNAME% -获取所属域信息:systeminfo 获取环境变量:set 0x01 获取系统安装的软件信息 -导出注册 ...
- C语言堆排序
堆是一种类似二叉树的数据结构,分为最大堆和最小堆,最大堆得定义是当前节点必须大于左右子节点,堆中所有节点都要符合这个定义.最小堆反之.这一点不同于二叉树排序.假设有数组int a[10] = {90, ...
- USB助手
自动拷贝U盘的数据--- 由于之前学习了win32的编程就想着做一个有趣的东西.想了想准备做一个可以自动复制U盘数据的程序. 对于这个程序的功能首先就是要能够识别U盘是否插入了,这里使用了函数GetL ...
- 实验三 敏捷开发与XP实践-1
实验内容 XP基础 XP核心实践 相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 2.完成实验.撰写实验报告,实 ...
- 2017-2018-1 20155318《信息安全技术》实验二——Windows口令破解
2017-2018-1 20155318<信息安全技术>实验二--Windows口令破解 一.实验原理 口令破解方法 口令破解主要有两种方法:字典破解和暴力破解. 字典破解是指通过破解者对 ...
- 【LG3243】[HNOI2015]菜肴制作
题面 洛谷 题解 首先我们有个非常显然的思路, 就是直接拓扑排序,用小根堆代替队列再按顺序输出,但是很显然是错的, 因为这只保证了字典序最小,而无法保证答案最优,\(<2,4>,<3 ...
- centos7下mysql 开启远程登录
安装mysql 安装mysql就不做过多的介绍了,相信小伙伴们都可以很轻松的安装 进入mysql命令行 mysql -u用户名 -p密码 新建远程登录的用户 grant all on *.* to a ...
- 那些不能遗忘的知识点回顾——C/C++系列(笔试面试高频题)
有那么一些零碎的小知识点,偶尔很迷惑,偶尔被忽略,偶然却发现它们很重要,这段时间正好在温习这些,就整理在这里,一起学习一起提高!后面还会继续补充. ——前言 1.面向对象的特性 封装.继承.多态. 封 ...