给定一个整数数组(下标由 0 到 n-1,其中 n 表示数组的规模),以及一个查询列表。每一个查询列表有两个整数 [start, end]。 对于每个查询,计算出数组中从下标 start 到 end 之间的数的最小值,并返回在结果列表中。

注意事项

在做此题前,建议先完成以下三道题 线段树的构造, 线段树的查询 及 线段树的修改

您在真实的面试中是否遇到过这个题?

Yes
样例

对于数组 [1,2,7,8,5], 查询 [(1,2),(0,4),(2,4)],返回 [2,1,5]

挑战

每次查询在O(logN)的时间内完成

思路1:直接调用sort函数对查询区间排序,然后将最小值存入容器;方法简单,但是时间复杂度高,超时了;

/**
* Definition of Interval:
* classs 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
*/
/*
思路1:直接调用sort函数对查询区间排序,然后将最小值存入容器;方法简单,但是时间复杂度高,超时了;
*/ vector<int> intervalMinNumber(vector<int> &A, vector<Interval> &queries) {
// write your code here vector<int> res;
if(queries.size()==0){
return res;
} vector<int> temp;
for(int i=0;i<queries.size();i++){
for(int k=queries[i].start;k<=queries[i].end;k++ ){
temp.push_back(A[k]);
}
sort(temp.begin(),temp.end());
res.push_back(temp[0]);
temp.clear();
} return res;
}
}

 思路2:构建线段树,构建方法参考线段树构造||;
          
           然后利用线段树的特殊性质进行查询;
          
           这道题目很经典,包含了线段树的构造,查询,一定要会!

/**
* Definition of Interval:
* classs Interval {
* int start, end;
* Interval(int start, int end) {
* this->start = start;
* this->end = end;
* }
*/ class SegmentTreeNode22 {
public:
int start, end, min;
SegmentTreeNode22* left, *right;
SegmentTreeNode22(int start, int end) {
this->start = start;
this->end = end;
this->min = 0;
this->left = this->right = NULL;
}
}; class Solution {
public:
/**
*@param A, queries: Given an integer array and an query list
*@return: The result list
*/
/*思路2:构建线段树,构建方法参考线段树构造||; 然后利用线段树的特殊性质进行查询; 这道题目很经典,包含了线段树的构造,查询,一定要会! /* //构建线段树;
SegmentTreeNode22* build(int start, int end, vector<int>& A) { if(start > end) {
return NULL;
} SegmentTreeNode22* root = new SegmentTreeNode22(start, end); if(start != end) {
int mid = (start + end) / 2;
root->left = build(start, mid, A);
root->right = build(mid+1, end, A);
root->min = min(root->left->min, root->right->min);
} else {
root->min = A[start];
}
return root;
} //线段树查询
int query(SegmentTreeNode22* root, int start, int end) { if(start <= root->start && root->end <= end) {
return root->min;
} int mid = (root->start + root->end)/2; if(start>mid)
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));
} vector<int> intervalMinNumber(vector<int> &A, vector<Interval> &queries) { SegmentTreeNode22* root = build(0, A.size()- 1, A);//构造线段树;
vector<int> res;
for(Interval qujian : queries) {
res.push_back(query(root, qujian.start, qujian.end));
}
return res;
}
};

Lintcode---区间最小数的更多相关文章

  1. CF484E Sign on Fence

    题意 给定一个长度为n的数列,有m次询问,询问形如l r k 要你在区间[l,r]内选一个长度为k的区间,求区间最小数的最大值 Sol 二分答案 怎么判定,每种数字开一棵线段树 某个位置上的数大于等于 ...

  2. Lintcode---区间求和 I

    给定一个整数数组(下标由 0 到 n-1,其中 n 表示数组的规模),以及一个查询列表.每一个查询列表有两个整数 [start, end] . 对于每个查询,计算出数组中从下标 start 到 end ...

  3. Sign on Fence CodeForces - 484E

    http://codeforces.com/problemset/problem/484/E 题意: 给定一个长度为n的数列,有m次询问,询问形如l r k 要你在区间[l,r]内选一个长度为k的区间 ...

  4. Uva 1609 Feel Good

    题面:给出长度为n的数列,然后算出其区间和乘区间最小数所能得到的最大值,并且输出区间 样例输入: 6 3 1 6 4 5 2 样例输出: 60 3 5 原题链接:https://vjudge.net/ ...

  5. [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, ...

  6. CodeForces - 840D:(主席树求出现区间出现次数大于某值的最小数)

    Once, Leha found in the left pocket an array consisting of n integers, and in the right pocket q que ...

  7. LintCode 30插入区间

    问题 给出一个无重叠的按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 样例 插入区间[2, 5] 到 [[1,2], ...

  8. lintcode: search for a range 搜索区间

    题目 搜索区间 给定一个包含 n 个整数的排序数组,找出给定目标值 target 的起始和结束位置. 如果目标值不在数组中,则返回[-1, -1] 样例 给出[5, 7, 7, 8, 8, 10]和目 ...

  9. lintcode: 二叉查找树中搜索区间

    题目 二叉查找树中搜索区间 给定两个值 k1 和 k2(k1 < k2)和一个二叉查找树的根节点.找到树中所有值在 k1 到 k2 范围内的节点.即打印所有x (k1 <= x <= ...

  10. lintcode:插入区间

    题目: 插入区间 给出一个无重叠的按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 样例 插入区间[2, 5] 到 [ ...

随机推荐

  1. Activity(活动)生命周期(2)--活动状态

    每个活动在其生命周期中最多会有4种状态 一.运行状态 当一个活动位于返回栈的栈顶的时候,这时活动就处于运行状态.系统一般不会回收,因为这会带来非常差的用户体验 二.暂停状态 当一个活动不处于栈顶状态的 ...

  2. 解决kylin报错:Failed to create dictionary on <db>.<table>, Caused by: java.lang.IllegalArgumentException: Too high cardinality is not suitable for dictionary

    报错信息: 2017-05-13 15:14:30,035 DEBUG [pool-9-thread-10] dict.DictionaryGenerator:94 : Dictionary clas ...

  3. nano命令,vi ed pico sed joe emacs jed ex

    nano命令   nano是一个字符终端的文本编辑器,有点像DOS下的editor程序.它比vi/vim要简单得多,比较适合Linux初学者使用.某些Linux发行版的默认编辑器就是nano. nan ...

  4. java jar包 log4j不能输出解决方法

    今天运行一个jar包,jar包中使用了springContext进行加载bean和log4j配置,但是发现不能正常输入日志. 代码中增加 Xxx.class.getResource("/&q ...

  5. delphi VCL研究之消息分发机制-delphi高手突破读书笔记

    1.VCL 概貌 先看一下VCL类图的主要分支,如图4.1所示.在图中可以看到,TObject是VCL的祖先类,这也是Object Pascal语言所规定的.但实际上,TObject以及TObject ...

  6. python学习:Windows 下 Python easy_install 的安装

    Windows 下 Python easy_install 的安装     下载安装python安装工具下载地址:http://pypi.python.org/pypi/setuptools 可以找到 ...

  7. 流畅的python第十八章使用asyncio包处理并发

    对比一个简单的多线程程序和对应的 asyncio 版,说明多线程和异步任务之间的关系asyncio.Future 类与 concurrent.futures.Future 类之间的区别摒弃线程或进程, ...

  8. 如何在Visual Studio中加载web load test的后缀为.ltrar的结果文件

    1. From a Web performance and load test project, open a load test.   2. On the embedded toolbar, cho ...

  9. jQuery对象的序列化详解

    一.param() 方法创建数组或对象的序列化表示. 该序列化值可在进行 AJAX 请求时在 URL 查询字符串中使用. 语法: jQuery.param(object,traditional) ob ...

  10. C#-遍历datatable的几种方法

    遍历datatable的方法2009-- :02方法一: DataTable dt = dataSet.Tables[]; ; i < dt.Rows.Count ; i++) { string ...