• lintcode :Segmemt Tree Build II


    题目

    Segmemt Tree Build II 

    The structure of Segment Tree is a binary tree which each node has two attributes start and end denote an segment / interval.

    start and end are both integers, they should be assigned in following rules:

    • The root's start and end is given by build method.
    • The left child of node A has start=A.left, end=(A.left + A.right) / 2.
    • The right child of node A hasstart=(A.left + A.right) / 2 + 1, end=A.right.
    • if start equals to end, there will be no children for this node.

    Implement a build method with a given array, so that we can create a corresponding segment tree with every node value represent the corresponding interval max value in the array, return the root of this segment tree.

    样例

    Given [3,2,1,4]. The segment tree will be:

                     [0,  3] (max = 4)
                      /            
            [0,  1] (max = 3)     [2, 3]  (max = 4)
            /                       /             
    [0, 0](max = 3)  [1, 1](max = 2)[2, 2](max = 1) [3, 3] (max = 4)
    
    说明

    Segment Tree (a.k.a Interval Tree) is an advanced data structure which can support queries like:

    • which of these intervals contain a given point
    • which of these points are in a given interval

    See wiki: Segment Tree Interval Tree

    解题

    理解题意:根据给的数组构建段树,该节点有区间及其该区间的最大值组成。区间的左右节点利用上面的规则计算。

    /**
     * Definition of SegmentTreeNode:
     * public class SegmentTreeNode {
     *     public int start, end, max;
     *     public SegmentTreeNode left, right;
     *     public SegmentTreeNode(int start, int end, int max) {
     *         this.start = start;
     *         this.end = end;
     *         this.max = max
     *         this.left = this.right = null;
     *     }
     * }
     */

    这个节点定义要好好理解。

    /**
     * Definition of SegmentTreeNode:
     * public class SegmentTreeNode {
     *     public int start, end, max;
     *     public SegmentTreeNode left, right;
     *     public SegmentTreeNode(int start, int end, int max) {
     *         this.start = start;
     *         this.end = end;
     *         this.max = max
     *         this.left = this.right = null;
     *     }
     * }
     */
    public class Solution {
        /**
         *@param A: a list of integer
         *@return: The root of Segment Tree
         */
        public SegmentTreeNode build(int[] A) {
            // write your code here
            return build(0,A.length-1,A);
        }
        public SegmentTreeNode build(int start,int end,int[] A){
            if(start > end ){
                return null;
            }
            SegmentTreeNode root = new SegmentTreeNode(start,end);
            if( start != end){
                int mid = (start + end)/2;
                root.left = build(start,mid,A);
                root.right = build(mid+1,end,A);
                root.max = Math.max(root.left.max,root.right.max);
            }else{
                root.max = A[start];
            }
            return root;
        }
    }
    Java Code

    总耗时: 2532 ms

    """
    Definition of SegmentTreeNode:
    class SegmentTreeNode:
        def __init__(self, start, end, max):
            self.start, self.end, self.max = start, end, max
            self.left, self.right = None, None
    """
    
    class Solution:    
        # @oaram A: a list of integer
        # @return: The root of Segment Tree
        def build(self, A):
            # write your code here
            return self.buildX(0,len(A) - 1,A)
        def buildX(self,start,end,A):
            if start > end:
                return None
            maxX = 0
            root = SegmentTreeNode(start,end)
            if start != end:
                mid = int((start + end)/2)
                root.left = self.buildX(start,mid,A)
                root.right = self.buildX(mid+1,end,A)
                root.max = max(root.left.max,root.right.max)
            else:
                root.max = A[start]
            return root 
    Python Code

    总耗时: 750 ms

  • 相关阅读:
    并行计算的技术路径
    Qt 中文编码问题记录
    rest_rpc 编译安装和测试 ubuntu18.04
    Qt QPorcess 启动外部程序失败的原因之一
    ubuntu 下 cesium的环境搭建
    Qt 渐变色笔记
    Qt编写的自定义控件为什么在QtDesigner中可见,在QtCreator中不可见
    Qt 编译及自动部署 库 工具集(自动复制生成的库及头文件到指定的安装路径)
    Windows10 OSG 编译安装及集成至Qt
    百度图像识别SDK简单使用
  • 原文地址:https://www.cnblogs.com/bbbblog/p/4943801.html
Copyright © 2020-2023  润新知