• 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 }
  • 相关阅读:
    BPF and eBPF linux
    o-sync-and-o-direct
    linux performance test
    iostat
    MYSQL IO innodb-buffer-pool
    MYSQL file types redo log
    read pread write pwrite open
    CORE DUMP
    linux kernel的中断子系统 softirq
    linux KERNEL 问题
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/5174355.html
Copyright © 2020-2023  润新知