Interval Minimum Number

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]

Analysis:

Use Segment tree to maintain the minimun value from index i to j.

 1 /**
 2  * Definition of Interval:
 3  * public classs Interval {
 4  *     int start, end;
 5  *     Interval(int start, int end) {
 6  *         this.start = start;
 7  *         this.end = end;
 8  *     }
 9  */
10 public class Solution {
11     /**
12      *@param A, queries: Given an integer array and an query list
13      *@return: The result list
14      */
15     SegmentTreeNode root;
16      
17     public ArrayList<Integer> intervalMinNumber(int[] A, 
18                                                 ArrayList<Interval> queries) {
19         // write your code here
20         ArrayList<Integer> res = new ArrayList<Integer>();
21         root = buildTree(A, 0, A.length-1);
22         query(res, queries);
23         return res;
24     }
25     
26     public void query(ArrayList<Integer> res, ArrayList<Interval> queries) {
27         for (Interval interval : queries) {
28             int result = queryTree(root, interval.start, interval.end);
29             res.add(result);
30         }
31     }
32     
33     public int queryTree(SegmentTreeNode cur, int start, int end) {
34         if (start==cur.start && end==cur.end) {
35             return cur.min;
36         }
37         int mid = (cur.start + cur.end)/2;
38         if (end <= mid) return queryTree(cur.left, start, end);
39         else if (start > mid) return queryTree(cur.right, start, end);
40         else return Math.min(queryTree(cur.left, start, mid), queryTree(cur.right, mid+1, end));
41     }
42     
43     public SegmentTreeNode buildTree(int[] A, int start, int end) {
44         SegmentTreeNode cur = new SegmentTreeNode(start, end);
45         if (start == end) {
46             cur.min = A[start];
47         }
48         else {
49             int mid = (start+end)/2;
50             cur.left = buildTree(A, start, mid);
51             cur.right = buildTree(A, mid+1, end);
52             cur.min = Math.min(cur.left.min, cur.right.min);
53         }
54         return cur;
55     }
56 }
57 
58 class SegmentTreeNode {
59         int min;
60         int start;
61         int end;
62         SegmentTreeNode left;
63         SegmentTreeNode right;
64         public SegmentTreeNode(int start, int end) {
65             this.start = start;
66             this.end = end;
67             this.min = Integer.MAX_VALUE;
68             this.left = null;
69             this.right = null;
70         }
71     } 

 

posted @ 2016-07-14 21:35  北叶青藤  阅读(221)  评论(0编辑  收藏  举报