您的位置:首页 > 其它

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 
[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);
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: