LintCode_205 Interval Minimum Number
2016-08-16 06:42
239 查看
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
Notice
We suggest you finish problem Segment
Tree Build, Segment Tree Query and Segment
Tree Modify first.
Have you met this question in a real interview?
Yes
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.
Notice
We suggest you finish problem Segment
Tree Build, Segment Tree Query and Segment
Tree Modify first.
Have you met this question in a real interview?
Yes
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);
}
}
};
相关文章推荐
- LintCode_205 Interval Minimum Number
- Lintcode: Interval Minimum Number
- *[Lintcode]Interval Minimum Number 区间最小数
- CF 205 CLittle Elephant and Interval 分类讨论(计数) D(暴力,水题)
- lintcode-区间最小数-205
- Lintcode_30 Insert Interval
- lintcode-medium-Interval Minimum Number
- LintCode 30:Insert Interval
- lintcode(205)区间最小数
- lintcode-205-区间最小数
- lintcode 30 Insert Interval
- CF 205 C Little Elephant and Interval(模拟)
- Lintcode: Interval Sum II
- lintcode-medium-Interval Sum
- #205 Interval Minimum Number
- LintCode_207 interval-sum-ii
- [Lintcode]Interval Sum II区间求和 II
- lintcode-easy-Insert Interval
- *[Lintcode]Interval Sum区间最小数
- 【简单】Lintcode 30:Insert Interval