给定一个整数数组(下标由 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. Problem X: 双层金字塔

    #include<stdio.h> int main() { int i,j,n,m; while(scanf("%d",&n)!=EOF) { ;i<= ...

  2. WPF中的动画——(二)From/To/By 动画

    我们所实现的的动画中,很大一部分是让一个属性在起始值和结束值之间变化,例如,我在前文中实现的改变宽度的动画: var widthAnimation = new DoubleAnimation()    ...

  3. POJ 3680 Intervals(费用流)

    Intervals Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5762   Accepted: 2288 Descrip ...

  4. Delphi 实现多线程编程的线程类 TThread

    http://blog.csdn.net/henreash/article/details/3183119 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉 ...

  5. GitHub 上100个最受欢迎的Java基础类库

    作为一名整天与既成熟且不断发展的Java语言打交道的开发者,面对的困境之一就是在我们编写代码的时候,是使用一些人人谈论的人们新技术呢,还是坚持使用一些虽旧但成熟的类库? 由于Java应用中大部分是商业 ...

  6. 在 Ubuntu 14.04 上安装 Ubuntu Tweak 0.8.8

    转自:http://linux.cn/article-3335-1.html 关于 Ubuntu Tweak,Ubuntu 老用户再熟悉不过了,Ubuntu tweak 相当于 windows 的优化 ...

  7. 万里长征第二步——django个人博客(第一步 ——创建主页)

    运行命令行工具,输入:pip install virtualenv  --安装virtualenv库. virtualenv blog_project_venv ——使用virtualenv创建一个虚 ...

  8. mybatis 执行传入的任意sql语句

    dao类 /** * 自定义sql查询 * @param sqlContent * @return */ public List<LinkedHashMap<String, Object& ...

  9. [转]Getting started with SSIS - Part 10: Event Handling and Logging

    本文转自:http://beyondrelational.com/modules/12/tutorials/24/tutorials/9686/getting-started-with-ssis-pa ...

  10. DBA数据库信息查询常用SQL

    常用DBA脚本1.查看表空间的名称及大小 select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size from dba_tabl ...