区间最小数-LintCode
来源:互联网 发布:美利达勇士300d淘宝 编辑:程序博客网 时间:2024/06/05 02:45
给定一个整数数组(下标由 0 到 n-1,其中 n 表示数组的规模),以及一个查询列表。每一个查询列表有两个整数 [start, end]。 对于每个查询,计算出数组中从下标 start 到 end 之间的数的最小值,并返回在结果列表中。
注意事项:
在做此题前,建议先完成以下三道题 线段树的构造, 线段树的查询 及 线段树的修改。
样例:
对于数组 [1,2,7,8,5], 查询 [(1,2),(0,4),(2,4)],返回 [2,1,5]
挑战 :
每次查询在O(logN)的时间内完成
#ifndef C205_H#define C205_H#include<iostream>#include<vector>using namespace std;class Interval{public: int start, end; Interval(int start, int end) { this->start = start; this->end = end; }};class SegmentTree{public: int start, end, min; SegmentTree *left, *right; SegmentTree(int start, int end, int min) { this->start = start, this->end = end, this->min = min; this->left = this->right = NULL; }};class Solution {public: /* * @param A: An integer array * @param queries: An query list * @return: The result list */ vector<int> intervalMinNumber(vector<int> &A, vector<Interval> &queries) { // write your code here vector<int> v; if (A.empty() || queries.empty()) return v; SegmentTree *root = build(A, 0, A.size() - 1); modify(root); for (auto c : queries) { v.push_back(query(root,c.start, c.end)); } return v; } SegmentTree * build(vector<int> &A,int start, int end) { if (start > end) return NULL; SegmentTree *node = new SegmentTree(start, end, 0); if (start == end) { node->min = A[start]; return node; } node->left = build(A, start, (start + end) / 2); node->right = build(A, (start + end) / 2 + 1, end); return node; } void modify(SegmentTree * root) { if (!root->left || !root->right) return; modify(root->left); modify(root->right); root->min = minVal(root->left->min, root->right->min); } int query(SegmentTree * root, int start, int end) { if (start > end || start<root->start || end>root->end) return 0; SegmentTree *node = root; if (start == node->start&&end == node->end) return node->min; if (end <= node->left->end) return query(node->left, start, end); else if (start >= node->right->start) return query(node->right, start, end); else { return minVal(query(node->left, start, node->left->end), query(node->right, node->right->start, end)); } } int minVal(int a, int b) { return a < b ? a : b; }};#endif
阅读全文
0 0
- LintCode:区间最小数
- 区间最小数-LintCode
- lintcode-区间最小数-205
- lintcode(205)区间最小数
- *[Lintcode]Interval Minimum Number 区间最小数
- *[Lintcode]Interval Sum区间最小数
- 题目:区间最小数
- 区间最小数
- 贪心——区间覆盖问题之区间完全覆盖最小区间数
- 求数组中区间中最小数*区间所有数和的最大值
- 求数组中区间中最小数*区间所有数和的最大值
- 205.Interval Minimum Number-区间最小数(中等题)
- 最小区间
- LintCode-搜索区间
- lintcode-156-合并区间
- lintcode-插入区间
- lintcode-搜索区间-61
- Lintcode搜索区间
- apache重写
- 搭建sceureCRT与虚拟机vm的环境三种方式很全面
- 搭建ELK(ElasticSearch+Logstash+Kibana)日志分析系统(三) logstash input output 配置
- java中的单例模式
- 第二周项目1
- 区间最小数-LintCode
- ERROR_SAMBA
- Lucene学习总结之七:Lucene搜索过程解析(8)
- Android 系统提示对话框(AlertDialog)的使用
- SCUT Training 20170913 Problem H
- Check Point R80 Security Management
- 各hbase版本对hadoop各版本的支持情况
- 二叉搜索树的后续遍历序列
- MVC路由Route