线段树【java实现】

news2025/7/19 16:57:40

一、解决问题

区间最值和区间求和问题

力扣相关题目: 

​​​​​​303. 区域和检索 - 数组不可变

729. 我的日程安排表 I

二、线段树定义

平衡二叉树,数组中的元素都存储在叶子结点中,如图是一个求区间最大值的线段树。

已知数组arr[11,5,3,7,8,2] ,树的高度与数组的长度关系为:

为了方便我们用代码实现线段树,将创建的数为满二叉树,如下图举例

三、实现线段树,并查询区间值

T[] data存储传入的原数组

T[] treeData存储构建的平衡二叉树

Merge<T> merge 融合器,表示线段树中节点值的计算方式

 Merge接口:

public interface Merge<T> {
    T merge(T v1,T v2);
}

线段树: 

import java.util.Arrays;

public class SegmentTree<T>{

    //原数组
    private T[] data;
    //构建的平衡二叉树的数组
    private T[] treeData;

    private Merge<T> merge;

    public SegmentTree(T[] arr,Merge<T> merge){
        // 入参判断
        if (arr==null||arr.length==0){
            return;
        }
        this.merge = merge;

        //将数组赋值到我们的原数组中
        this.data = Arrays.copyOf(arr,arr.length);

        //计算树的高度
        int h = (int)Math.ceil(Math.log10(arr.length)/Math.log10(2)+1);
        //平衡二叉树节点个数
        int length = (int)Math.pow(2,h)-1;
        //初始化树
        this.treeData = (T[]) new Object[length];
      //  构建平衡二叉树
        this.buildingSegmentTree(0,arr.length-1,0);
    }

    /**
     * 构建平衡二叉树
     * @param left 原数组的左边索引
     * @param right 原数组的右边索引
     * @param index 构建树的索引
     */
    private void buildingSegmentTree(int left,int right,int index){
    //   递归终止条件
        if (left==right){
            this.treeData[index] = this.data[left];
            return;
        }
    //    递归操作
        int mid = left+(right-left)/2;
        buildingSegmentTree(left,mid,2*index+1);
        buildingSegmentTree(mid+1,right,2*index+2);
        //计算当前节点的值
        this.treeData[index] = this.merge.merge(this.treeData[2*index+1],this.treeData[2*index+2]);
    }



    //查询
    public T query(int from,int to){
        if (from<0||to>this.data.length||to<from){
            return null;
        }
        return query(0,this.data.length-1,0,from,to);
    }
    /**
     *
     * @param left 原数组的左位置
     * @param right 原数组的右位置
     * @param index 平衡二叉树的中对应节点的索引
     * @param from 所求索引的开始位置
     * @param to 所求索引的结束位置
     * @return
     */
    private T query(int left,int right,int index,int from,int to){
        //找到区间
        if (left==from&&right==to){
            return this.treeData[index];
        }
        int mid = left + (right-left)/2;
        if (to<=mid){//去左找
            return query(left,mid,index*2+1,from,to);
        }else if (from>mid){//去右找
            return query(mid+1,right,index*2+2,from,to);
        }else {//两遍都有
            T leftVal = query(left,mid,index*2+1,from,mid);
            T rightVal = query(mid+1,right,index*2+2,mid+1,to);
            return this.merge.merge(leftVal,rightVal);
        }
    }

    public static void main(String[] args) {
        Integer[] arr = {1,3,5,7,9,11};
        SegmentTree<Integer> tree = new SegmentTree<Integer>(arr,(v1,v2)->v1>v2?v1:v2);
        int res =  tree.query(2,4);
        System.out.println(res);
    }
}

测试:

    public static void main(String[] args) {
        Integer[] arr = {11,5,3,6,7,8,2};
        SegmentTree<Integer> tree = new SegmentTree<Integer>(arr,(v1,v2)->v1>v2?v1:v2);
        int res =  tree.query(2,4);
        System.out.println(res);//7
    }

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1103188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电源特性测试之电源模块负载调整率测试方法及测试条件

负载调整率是衡量电源好坏的重要指标&#xff0c;它反映的是当负载电流变化时&#xff0c;稳压电源输出电压相应的变化情况。好的电源负载变化时引起的输出变化较小&#xff0c;通常是在3%-5%。负载调整率是电源模块测试的一个重要步骤&#xff0c;今天纳米软件将为大家介绍负载…

Yakit工具篇:综合目录扫描与爆破的使用

简介&#xff08;来自官方文档&#xff09; 目录扫描是一种常用的Web应用程序安全测试技术&#xff0c;用于发现Web应用程序中存在的可能存在的漏洞和弱点。其原理是通过对Web应用程序中的目录和文件进行遍历&#xff0c;来发现可能存在的安全漏洞和风险。 具体来说&#xff…

大语言模型在推荐系统的实践应用

本文从应用视角出发&#xff0c;尝试把大语言模型中的一些长处放在推荐系统中。 01 背景和问题 传统的推荐模型网络参数效果较小(不包括embedding参数)&#xff0c;训练和推理的时间、空间开销较小&#xff0c;也能充分利用用户-物品的协同信号。但是它的缺陷是只能利用数据…

《进化优化》第5章 进化规划

文章目录 5.1 连续进化规划5.2 有限状态机优化5.3 离散进化规划5.4 囚徒困境5.5 人工蚂蚁问题 5.1 连续进化规划 目的&#xff1a;最小化f(x)&#xff0c; 这里的x是一个n维向量&#xff0c;假定对所有的x, f(x)>0。 进化规划从随机生成的一个个体种群{xi}开始, 按如下方式…

Umi3实战教程

一、框架介绍 umi是蚂蚁金服的前端开发框架&#xff0c;它内置了路由、web/移动端UI库、数据流、权限控制、常用hooks库、构建、部署、测试、等等一些工具&#xff0c;几乎涵盖了正常前端开发要用到的所有工具。 二、环境准备 pnpm 相比npm、yarn&#xff0c;pnpm更小更快扁平…

为大模型而生!顶流大佬发起成立学术会议 COLM,或成为未来 NLP 最强顶会?!

夕小瑶科技说 原创 作者 | 智商掉了一地、ZenMoore 前段时间&#xff0c;ACL 2024 的主席公开抨击称“ arXiv是科研的毒瘤”&#xff0c;这引发了大范围的争论。 一时间&#xff0c;大家对 *CL 的抵触情绪愈发高涨&#xff0c;绝大多数学界都在这场辩论中站在了支持 arXivTwit…

PreparedStatement

使用参数化查询&#xff1a;使用预编译的语句和参数化查询来执行SQL语句&#xff0c;而不是将用户输入直接嵌入到SQL语句中。这将帮助防止恶意输入注入SQL语句。

Zoho WorkDrive荣获专业研究机构评定的“Leader”称号

近年&#xff0c;在云计算、大数据、移动互联网、社交所引领的数字化转型变革中&#xff0c;企业对于数字资产的保护和利用愈加重视。相较于结构化数据&#xff0c;企业对于非结构化数据&#xff08;文档、图片、音视频等&#xff09;管理的需求更强、难度更大。 同时&#xf…

NodeJS 菜鸟教程目录

NodeJS 七天入门教程 谁适合阅读本教程? 前端开发者和希望构建后端的开发者:如果你是一名前端开发者,或者是一名希望构建后端的开发者,那么本教程将为你提供一个很好的学习Node.js的机会。通过学习本教程,你可以更好地了解后端开发的技术和Node.js在后端开发中的应用。初学…

日常学习记录随笔-redis实战

redis的持久化&#xff08;rdb,aof,混合持久化&#xff09; redis的主从架构以及redis的哨兵架构 redis的clusterredis 是要做持久化的&#xff0c;一般用redis会把数据放到缓存中为了提升系统的性能 如果redis没有持久化&#xff0c;重启的化数据就会丢失&#xff0c;所有的请…

【LeetCode热题100】--31.下一个排列

31.下一个排列 思路&#xff1a; 方法&#xff1a;两遍扫描 注意到下一个排列总是比当前排列要大&#xff0c;除非该排列已经是最大的排列。我们希望找到一种方法&#xff0c;能够找到一个大于当前序列的新序列&#xff0c;且变大的幅度尽可能小。具体地&#xff1a; 我们需要…

5年经验之谈 —— App测试、Web测试和接口测试一般测试流程!

app测试流程&#xff1a; 1、需求分析&#xff0c;了解具体需求 2、测试准备&#xff1a;原型图、效果图、需求文件、测试用例、用例评审、各种测试数据准备 3、测试环节&#xff1a;接受版本&#xff0c;开始执行 1&#xff09;冒烟测试&#xff1a;对版本质量的控制以及此…

【LeetCode: 260. 只出现一次的数字 III | 位运算 | 哈希表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

ModStartCMS v7.4.0 公共图片库支持,安全功能升级

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议&#xff0c;免费且不限制商业使用。 功能特性 丰富的模块市…

C# 开发工具包 – 现已正式发布

作者&#xff1a;Wendy Breiding 排版&#xff1a;Alan Wang 今天&#xff0c;我们很高兴地宣布 C# 开发工具包正式发布&#xff0c;C# 开发工具包是一个 Visual Studio Code 扩展&#xff0c;为 Linux、macOS 和 Windows 带来了改进的编辑器优先 C# 开发体验。 谢谢社区的努…

文件传输软件的挑战与发展趋势

无论是在教育、医疗、金融、媒体、政府等行业&#xff0c;还是在个人生活和工作中&#xff0c;文件传输软件都有着广泛的应用价值和意义。然而&#xff0c;随着信息技术的发展和数据量的增长&#xff0c;文件传输软件也面临着一些挑战和问题&#xff0c;同时也有着一些发展趋势…

eNSP在hybrid接口上配置vlan

一、什么是vlan VLAN&#xff08;Virtual Local Area Network&#xff0c;虚拟局域网&#xff09;是一种通信技术&#xff0c;它可以将一个物理的局域网在逻辑上划分成多个广播域。每个VLAN都是一个广播域&#xff0c;VLAN内的主机可以直接通信&#xff0c;而VLAN之间则不能直…

SAP-QM-质检收货时报错

采购订单收货时&#xff0c;报错,点击蓝字查看未清的检验批&#xff0c;做使用决策QA11&#xff0c;完成后回复正常。

论文阅读-FCD-Net: 学习检测多类型同源深度伪造人脸图像

一、论文信息 论文题目&#xff1a;FCD-Net: Learning to Detect Multiple Types of Homologous Deepfake Face Images 作者团队&#xff1a;Ruidong Han , Xiaofeng Wang , Ningning Bai, Qin Wang, Zinian Liu, and Jianru Xue &#xff08;西安理工大学&#xff0c;西安交…

李航:关于大模型的思考及研究热点

本文阐述李航老师对 LLM 的一些看法&#xff0c;主要观点如下&#xff1a; ChatGPT 的突破主要在于规模带来的质变和模型调教方式的发明。 LLM 融合了实现人工智能的三条路径。 LLM 的开发需要结合第三者体验和第一者体验。 LLM 能近似生成心智语言。 LLM 需要与多模态大模…