java贪心算法(线段树)的详细介绍

 

 java贪心算法(线段树)的详细介绍_第1张图片

 注意区间的改变!(原来的部分被重新区间的染色覆盖了)

 java贪心算法(线段树)的详细介绍_第2张图片

 java贪心算法(线段树)的详细介绍_第3张图片

 

 

 

 java贪心算法(线段树)的详细介绍_第4张图片

 

 java贪心算法(线段树)的详细介绍_第5张图片

 

 注意以求和问题为列,把整个区间分为很多段,当你求那一段时候,这样直接就可以拿。

 

 每一个孩子区间都是相应的父节点的半段

 java贪心算法(线段树)的详细介绍_第6张图片

注意叶子节点不一定在最后一层 

java贪心算法(线段树)的详细介绍_第7张图片

 

 java贪心算法(线段树)的详细介绍_第8张图片

 

 java贪心算法(线段树)的详细介绍_第9张图片

 

求和区间的实现:

定义一个接口(融合器就是方便我对区间的操作)

public interface Merge {
    E merge(E a,E b);
}
public class SegMentTree {
    private E[] tree;
    private E data[] ;//存储一个副本
    private Merge merge;//用户构造好这个线段树时候同时构造好融合器
    //考虑整个区间
    public SegMentTree(E[] arr,Mergemerge){ //传入一个融合器
        this.merge = merge;
        data = (E[])new Object[arr.length];
        for (int i=0;i segMentTree = new SegMentTree(nums,(a,b)->a+b);
        SegMentTree segMentTree = new SegMentTree(nums, new Merge() {
            @Override
            public Integer merge(Integer a, Integer b) {
                return a+b;
            }
        });
        System.out.println(segMentTree);
    }
}

java贪心算法(线段树)的详细介绍_第10张图片

 

 

 下面是对区间查询的代码实现和思路:

 

java贪心算法(线段树)的详细介绍_第11张图片

 

定义一个接口(融合器就是方便我对区间的操作)

public interface Merge {
    E merge(E a,E b);
}
public class SegMentTree {
    private E[] tree;
    private E data[] ;//存储一个副本
    private Merge merge;//用户构造好这个线段树时候同时构造好融合器
    //考虑整个区间
    public SegMentTree(E[] arr,Mergemerge){ //传入一个融合器
        this.merge = merge;
        data = (E[])new Object[arr.length];
        for (int i=0;i=mid+1){
            return query(rightTreeIndex,mid+1,r,queryL,queryR);
        }else if (queryR<=mid){
            return query(leftTreeIndex,l,mid,queryL,queryR);
        }
        //分散在两个区间
        E leftResult = query(leftTreeIndex,l,mid,queryL,queryR);
        E rightResult = query(rightTreeIndex,mid+1,r,mid+1,queryR);
        return merge.merge(leftResult,rightResult);
    }

    @Override
    public String toString() {
        StringBuilder res = new StringBuilder();
        res.append('[');
        for (int i = 0; i  segMentTree = new SegMentTree(nums,(a,b)->a+b);
        SegMentTree segMentTree = new SegMentTree(nums, new Merge() {
            @Override
            public Integer merge(Integer a, Integer b) {
                return a+b;
            }
        });
        System.out.println(segMentTree);
        System.out.println(segMentTree.query(0,2));
    }
}

java贪心算法(线段树)的详细介绍_第12张图片

你可能感兴趣的:(java算法,java)