205. 区间最小数
给定一个整数数组(下标由 0 到 n-1,其中 n 表示数组的规模),以及一个查询列表。每一个查询列表有两个整数
[start, end]
。 对于每个查询,计算出数组中从下标 start 到 end 之间的数的最小值,并返回在结果列表中。
样例
样例1:
输入:数组 :[1,2,7,8,5] 查询 :[(1,2),(0,4),(2,4)]。输出:[2,1,5]
样例2:
输入:数组 :[4,5,7,1] 查询 :[(1,2),(1,3)]。输出:[5,1]
挑战
每次查询在O(logN)的时间内完成
/**
* Definition of Interval:
* public classs Interval {
* int start, end;
* Interval(int start, int end) {
* this.start = start;
* this.end = end;
* }
* }
*/
public class Solution {
/**
* @param A: An integer array
* @param queries: An query list
* @return: The result list
*/
public List<Integer> intervalMinNumber(int[] A, List<Interval> queries) {
List<Integer> list = new ArrayList<>();
SegmentTreeNode segmentTreeNode = build(A, 0, A.length - 1);
for (int i = 0; i < queries.size(); i++) {
list.add(query(segmentTreeNode, queries.get(i).start, queries.get(i).end));
}
return list;
}
public SegmentTreeNode build(int[] A, int start, int end) {
SegmentTreeNode ret = new SegmentTreeNode(start, end);
if (start == end) {
ret.min = A[start];
return ret;
}
int mid = (start + end) / 2;
ret.left = build(A, start, mid);
ret.right = build(A, mid + 1, end);
ret.min = Math.min(ret.left.min, ret.right.min);
return ret;
}
public int query(SegmentTreeNode root, int start, int end) {
if (root == null || end < start ) {
return Integer.MAX_VALUE;
}
if (root.start >= start && root.end <= end) {
return root.min;
}
return Math.min(query(root.left, start, end), query(root.right, start, end));
}
public class SegmentTreeNode {
public int start, end,min;
public SegmentTreeNode left, right;
public SegmentTreeNode(int start, int end) {
this.start = start;
this.end = end;
this.left = this.right = null;
}
}
}