给定一个整数数组(下标由 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;
}
};

最新文章

  1. Logback日志系统配置攻略
  2. hdu 4039 2011成都赛区网络赛I ***
  3. autoreleasepool自动释放池
  4. WPFFontCache_v0400.exe CPU使用率过高的问题
  5. Magento 自定义URL 地址重写 分类分级显示
  6. linux 查看当前所在目录的全路径
  7. CentOS下防火墙的基本操作命令
  8. POJ-2774-Long Long Message(后缀数组-最长公共子串)
  9. myeclipse 8.5打开文件Could not open the editor: Invalid thread access 异常
  10. 使用Git将本地项目或代码上传到GitHub上
  11. phpExcel导出excel加超级链接的实例代码[转]
  12. Entity Framework VS Mybatis 不同点剖析
  13. LDAP概念和原理介绍
  14. Qt如何去掉按钮等控件的虚线框(焦点框)
  15. [DUBBO] Unexpected error occur at send statistic, cause: Forbid consumer 192.168.3.151 access servic
  16. 如何判断ACCESS数据库有无密码
  17. ajax单删
  18. JQ 实现监测input中值的变化并绑定到另个input
  19. VSFTP再配置 我里个去马蛋网上这么多烂文章,走了好多弯路
  20. 001. MyBatis+SpringMVC+Spring[重置版]

热门文章

  1. Elasticsearch-Kibana 5.5.1插件安装
  2. 用GDB 调试Java程序
  3. 推荐一篇讲arm架构gcc内联汇编的文章
  4. 【docker】【redis】2.docker上设置redis集群---Redis Cluster部署【集群服务】【解决在docker中redis启动后,状态为Restarting,日志报错:Configured to not listen anywhere, exiting.问题】【Waiting for the cluster to join...问题】
  5. C语言基本数据类型简介
  6. [Java基础] Java线程复习笔记
  7. 用latex写毕业论文
  8. 二十四种设计模式:备忘录模式(Memento Pattern)
  9. unity 实时间接光照 解决方案
  10. less、sass、stylus