sweet1cris

Untitled

Feb 10th, 2018
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.85 KB | None | 0 0
  1.  
  2. public class Solution {
  3.    
  4.    
  5.     public class SegmentTreeNode {
  6.         public int start, end;
  7.         public int min;
  8.         public SegmentTreeNode left, right;
  9.         public SegmentTreeNode(int start, int end, int min) {
  10.               this.start = start;
  11.               this.end = end;
  12.               this.min = min;
  13.               this.left = this.right = null;
  14.         }
  15.      }
  16.    
  17.      public SegmentTreeNode build(int start, int end, int[] A) {
  18.         if(start > end) {
  19.             return null;
  20.         }
  21.         //叶节点
  22.         if(start == end) {
  23.             return new SegmentTreeNode(start, end, A[start]);
  24.         }
  25.         //递归构建子树
  26.         int mid = (start + end) / 2;
  27.         SegmentTreeNode root = new SegmentTreeNode(start, end, Integer.MAX_VALUE);
  28.         root.left = build(start, mid, A);
  29.         root.right = build(mid + 1, end, A);
  30.         //更新该节点信息
  31.         if(root.left != null) {
  32.             root.min = Math.min(root.min, root.left.min);
  33.         }
  34.         if(root.right != null) {
  35.             root.min = Math.min(root.min, root.right.min);
  36.         }
  37.         return root;
  38.      }
  39.      
  40.      public int query(SegmentTreeNode root, int start, int end) {
  41.         if(start <= root.start && root.end <= end) {
  42.             return root.min;
  43.         }
  44.         int mid = (root.start + root.end) / 2;
  45.         int ans = Integer.MAX_VALUE;
  46.         //包括左区间
  47.         if(start <= mid) {
  48.             ans = Math.min(ans, query(root.left, start, end));
  49.         }
  50.         //包括右区间
  51.         if(end > mid) {
  52.             ans = Math.min(ans, query(root.right, start, end));
  53.         }
  54.         return ans;
  55.      }
  56.      
  57.      public int [] business(int [] A, int k) {
  58.          int [] ans = new int [A.length];
  59.          
  60.          SegmentTreeNode root = build(0, A.length - 1, A);
  61.          for(int i = 0; i < A.length; i++) {
  62.                 int l = i - k;
  63.                 int r = i + k;
  64.                 if(l < 0) {
  65.                     l = 0;
  66.                 }
  67.                 if(r > A.length - 1) {
  68.                     r = A.length - 1;
  69.                 }
  70.                 int value = A[i] - query(root, l, r);
  71.                 ans[i] = value;
  72.             }
  73.          
  74.          return ans;
  75.      }
  76. }
Advertisement
Add Comment
Please, Sign In to add comment