LintCode_205 Interval Minimum Number
2016-07-25 10:26
246 查看
Given an integer array (index from 0 to n-1, where n is the size of this array), and an query list. Each query has two integers
Example
For array
and queries
Challenge
O(logN) time for each query
用线段树实现, 注意区间是左闭右开:
/**
* 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
*/
vector<int> intervalMinNumber(vector<int> &A, vector<Interval> &queries) {
// write your code here
vector<int> res;
vector<int> dat = init(A);
for (int i = 0; i < queries.size(); i++) {
int min_val = query(dat, queries[i].start, queries[i].end + 1, 0, 0, dat.size() / 2);
//注意区间是左闭右开;
res.push_back(min_val);
}
return res;
}
vector<int> init (vector<int> &A) {
int len = A.size();
int n = 1;
while ( n <= len) {
n*=2;
}
vector<int> dat(2 * n, INT_MAX);
for (int i = 0; i < A.size(); i++) {
update(dat, i, A[i]);
}
// for (int i = 0; i < dat.size(); i++) {
// cout<<dat[i]<<" ";
// }
return dat;
}
void update(vector<int> &dat, int k, int value) {
int n = dat.size() / 2;
k += n - 1; //注意要去掉第一个;
dat[k] = value;
while (k > 0) {
k = (k - 1) / 2;
dat[k] = min(dat[k * 2 + 1], dat[k * 2 + 2]);
}
}
int query (vector<int> &dat, int a, int b, int k, int l, int r) {
// l 和 r 代表节点k所代表的区间
//注意区间是左闭右开;
if (r <= a || b <= l) {
return INT_MAX;
}
if (a <= l && r <= b) {
return dat[k];
}else {
int v1 = query(dat, a, b, k * 2 + 1, l, (l + r) / 2);
int v2 = query(dat, a, b, k * 2 + 2, (l + r) / 2, r);
return min(v1, v2);
}
}
};
[start, end]. For each query, calculate the minimum number between index start and end in the given array, return the result list.
Example
For array
[1,2,7,8,5],
and queries
[(1,2),(0,4),(2,4)], return
[2,1,5]
Challenge
O(logN) time for each query
用线段树实现, 注意区间是左闭右开:
/**
* 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
*/
vector<int> intervalMinNumber(vector<int> &A, vector<Interval> &queries) {
// write your code here
vector<int> res;
vector<int> dat = init(A);
for (int i = 0; i < queries.size(); i++) {
int min_val = query(dat, queries[i].start, queries[i].end + 1, 0, 0, dat.size() / 2);
//注意区间是左闭右开;
res.push_back(min_val);
}
return res;
}
vector<int> init (vector<int> &A) {
int len = A.size();
int n = 1;
while ( n <= len) {
n*=2;
}
vector<int> dat(2 * n, INT_MAX);
for (int i = 0; i < A.size(); i++) {
update(dat, i, A[i]);
}
// for (int i = 0; i < dat.size(); i++) {
// cout<<dat[i]<<" ";
// }
return dat;
}
void update(vector<int> &dat, int k, int value) {
int n = dat.size() / 2;
k += n - 1; //注意要去掉第一个;
dat[k] = value;
while (k > 0) {
k = (k - 1) / 2;
dat[k] = min(dat[k * 2 + 1], dat[k * 2 + 2]);
}
}
int query (vector<int> &dat, int a, int b, int k, int l, int r) {
// l 和 r 代表节点k所代表的区间
//注意区间是左闭右开;
if (r <= a || b <= l) {
return INT_MAX;
}
if (a <= l && r <= b) {
return dat[k];
}else {
int v1 = query(dat, a, b, k * 2 + 1, l, (l + r) / 2);
int v2 = query(dat, a, b, k * 2 + 2, (l + r) / 2, r);
return min(v1, v2);
}
}
};
相关文章推荐
- 统一配置管理-百度disconf
- HttpClient和WebService的区别和介绍
- Windows中安装jdk,出现javac不是内部或外部命令 也不是可运行的程序
- 设计模式(八)外观模式
- 设计模式之外观模式
- 简单换肤
- AFNetWorking3.0的简单封装
- Linux 文件搜索指令 find locate whereis which type
- DM368学习--捕获视频图像分辨率修改
- POJ1125
- PyDev Unresolved Import Error
- iOS真机调试时可能出现的问题
- DES/3DES/AES区别
- 【Effective C++读书笔记】篇九(条款22~条款24)
- linux之top命令
- 【机器学习】贝叶斯决策论小结
- Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.5:compile
- 【排序】【二分】【UVa 815】洪水(Flooded!)
- 子进程 已安装 pre-removal 脚本 返回了错误号 1或2 与 子进程 已安装 post-installation 脚本 返回了错误号 1或2
- github 开源项目