zoukankan      html  css  js  c++  java
  • Lintcode: Segment Tree Modify

    For a Maximum Segment Tree, which each node has an extra value max to store the maximum value in this node's interval.
    
    Implement a modify function with three parameter root, index and value to change the node's value with [start, end] = [index, index] to the new given value. Make sure after this change, every node in segment tree still has the max attribute with the correct value.
    
    Have you met this question in a real interview? Yes
    Example
    For segment tree:
    
                          [1, 4, max=3]
                        /                
            [1, 2, max=2]                [3, 4, max=3]
           /                           /             
    [1, 1, max=2], [2, 2, max=1], [3, 3, max=0], [4, 4, max=3]
    if call modify(root, 2, 4), we can get:
    
                          [1, 4, max=4]
                        /                
            [1, 2, max=4]                [3, 4, max=3]
           /                           /             
    [1, 1, max=2], [2, 2, max=4], [3, 3, max=0], [4, 4, max=3]
    or call modify(root, 4, 0), we can get:
    
                          [1, 4, max=2]
                        /                
            [1, 2, max=2]                [3, 4, max=0]
           /                           /             
    [1, 1, max=2], [2, 2, max=1], [3, 3, max=0], [4, 4, max=0]
    Note
    We suggest you finish problem Segment Tree Build and Segment Tree Query first.
    
    Challenge
    Do it in O(h) time, h is the height of the segment tree.
     1 /**
     2  * Definition of SegmentTreeNode:
     3  * public class SegmentTreeNode {
     4  *     public int start, end, max;
     5  *     public SegmentTreeNode left, right;
     6  *     public SegmentTreeNode(int start, int end, int max) {
     7  *         this.start = start;
     8  *         this.end = end;
     9  *         this.max = max
    10  *         this.left = this.right = null;
    11  *     }
    12  * }
    13  */
    14 public class Solution {
    15     /**
    16      *@param root, index, value: The root of segment tree and 
    17      *@ change the node's value with [index, index] to the new given value
    18      *@return: void
    19      */
    20     public void modify(SegmentTreeNode root, int index, int value) {
    21         // write your code here
    22         if (root.start == root.end) {
    23             root.max = value;
    24             return;
    25         }
    26         int mid = (root.start + root.end)/2;
    27         if (index <= mid) modify(root.left, index, value);
    28         else modify(root.right, index, value);
    29         root.max = Math.max(root.left.max, root.right.max);
    30     }
    31 }
  • 相关阅读:
    如何找出阻塞的线程正在等待哪个线程
    探索Windows 10的CFG机制
    异常0xc000041d的抛出过程
    异常STATUS_FATAL_USER_CALLBACK_EXCEPTION(0xc000041d)
    VisualStudio中集成扩展调试SOS
    clr调试扩展和DAC
    WinDbg常用命令系列---sx, sxd, sxe, sxi, sxn, sxr, sx- (设置异常)
    CLR调试时的sos.dll/clr.dll/mscorwks.dll/mscordacwks.dll等动态库的版本对应
    WinDbg常用命令系列---!runaway
    WinDbg常用命令系列---!findstack
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/5174355.html
Copyright © 2011-2022 走看看