439 - 线段树的构造 II

本文介绍在构建区间树过程中,如何正确地截取数组以形成左右子树,避免数组越界的错误,并提供具体实现代码。

2017.9.8

在截取数组的时候,出现了一些小问题。

截取左子树部分的时候,没有什么问题,基本是 from  0 to mid,在 from mid to end 就可以了。

但是截取右子树的时候,就需要注意了。此时的数组数组A是已经被截过的。如果还是mid = (start + end)/2 的话,就会出现越界的情况。

这个时候,mid = (start + end)/ 2 - start。

核心的代码就是下边两句。

Arrays.copyOfRange(A,0,(start + end)/2+1-start)

Arrays.copyOfRange(A,(start + end)/2+1-start, A.length)

这种情况在构造树的的时候经常见到,这次确实是马虎了。以后要多多注意。

/**
 * 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 static SegmentTreeNode build(int[] A,int start,int end) {
        // write your code here
		if(A == null || A.length <= 0){
			return null;
		}
		int mid = (start + end)/2;
		int []B = Arrays.copyOf(A, A.length);
		Arrays.sort(B);
		SegmentTreeNode root = new SegmentTreeNode(start,end,B[B.length-1]);
		if(start < end){
			root.left = build(Arrays.copyOfRange(A,0,(start + end)/2+1-start),start,mid);
			root.right = build(Arrays.copyOfRange(A,(start + end)/2+1-start, A.length),mid+1,end);
		}
		return root;
    }
   	public SegmentTreeNode build(int[] A) {
        // write your code here
		if(A == null || A.length <= 0){
			return null;
		}
		SegmentTreeNode root = build(A,0,A.length-1);
		return root;
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值