Java实现差分数组的示例详解

 更新时间:2022年06月09日 10:58:21   作者:Carol  
差分数组是由原数组进化而来,值为原数组当前位置值减去上一个位置的值。本文将通过例题详解如何利用Java实现差分数组,需要的可以参考一下

前言

昨天(2022-06-07)在做leetcode每日一题的时候,第一次看到了这个超级简单但是很实用的算法---差分数组,差分数组是由原数组进化而来,值为原数组当前位置值减去上一个位置的值,看下面这个图片就很清楚了。

从上图中我们可以很清晰的看到,diffArray[1]=-3=srcArray[1]-srcArray[0]=-1-2,那么当我们在已知差分数组的情况下,如何推出原数组,同样依据上面的关系,但是我们需要从index=0,依次将当前差分数组与原数组的上一个值进行累加。

应用场景

试想一个场景,我们需要将位置0~8的数值都加上一个相同的数值,如果在原数组上操作,我们需要更改9个位置的值,但是我们在差分数组的位置上操作,我们只需要更改两个位置的值,即位置0和8分别加上值,我们通过差分数组就能得到位置0~8之间的其他位置的正确值。

这种方式在一次性更新大量数据时候性能提升更加明显。

Leetcode题目实战

题目描述

当 k 个日程安排有一些时间上的交叉时(例如 k 个日程安排都在同一时间内),就会产生 k 次预订。给你一些日程安排 [start, end) ,请你在每个日程安排添加后,返回一个整数 k ,表示所有先前日程安排会产生的最大 k 次预订。实现一个 MyCalendarThree 类来存放你的日程安排,你可以一直添加新的日程安排。MyCalendarThree() 初始化对象。int book(int start, int end) 返回一个整数 k ,表示日历中存在的 k 次预订的最大值。提示:0 <= start < end <= 10^9每个测试用例,调用 book 函数最多不超过 400次

思路

在上面的题目描述中,如果时间点有重合,这个时间点预定次数+1,最容易想到的就是暴力解法,每个时间点出现就将该时间点预定次数+1,但是看看数据量,最大值10^9,如果只有一个时间段[0-10^9],那我们在时间和空间上都损失了不少。这时候我们就可以使用上面所说的差分数组,仅仅更新开始时间和结束时间,然后进行计算。我们可以使用一个map存储差分数组更改的最终结果(差分数组开始时值全为0),key为开始时间或者结束时间点,value为预定次数,当出现一个日程[start,end),我们需要将start位置预定次数+1,而因为是开区间,end并不包含在此次日程中,相当于在原数组中end-1位置的值+1,但是end位置的值没变,所以差分数组中end位置的值需要-1。接下来看看具体实现代码

代码

TreeMap<Integer, Integer> treeMap;
   public MyCalendarThree() {
       treeMap = new TreeMap<>();
  }
public int book(int start, int end) {
       if (!treeMap.containsKey(start)) {
           treeMap.put(start, 0);
      }
       if (!treeMap.containsKey(end)) {
           treeMap.put(end, 0);
      }
       treeMap.put(start, treeMap.get(start) + 1);
       treeMap.put(end, treeMap.get(end) - 1);
       //x1 - 0 = value1 x2 - x1 = value2
       int answer = 0;
       int max = 0;
       for (Integer value : treeMap.values()) {
           max += value;
           answer = Math.max(max, answer);
      }
       return answer;
  }

到此这篇关于Java实现差分数组的示例详解的文章就介绍到这了,更多相关Java差分数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • spring boot配合前端实现跨域请求访问

    spring boot配合前端实现跨域请求访问

    本篇文章主要介绍了spring boot配合前端实现跨域请求访问,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • Java中Spring对事务的支持详解

    Java中Spring对事务的支持详解

    这篇文章主要介绍了Java中Spring对事务的支持详解,Spring对事务的支持有两种方式,一是自己编写事务,精确控制事务的边界,二是采用声明事务的方式,使用AOP来完成,需要的朋友可以参考下
    2023-07-07
  • java开发微信分享接口的步骤

    java开发微信分享接口的步骤

    这篇文章主要为大家详细介绍了java开发微信分享接口的步骤,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • Java NIO原理图文分析及代码实现

    Java NIO原理图文分析及代码实现

    本文主要介绍Java NIO原理的知识,这里整理了详细资料及简单示例代码和原理图,有需要的小伙伴可以参考下
    2016-09-09
  • Java布隆过滤器的应用实例

    Java布隆过滤器的应用实例

    这篇文章主要介绍了Java布隆过滤器的应用实例,在程序的世界中,布隆过滤器是程序员的一把利器,利用它可以快速地解决项目中一些比较棘手的问题,如网页 URL 去重、垃圾邮件识别、大集合中重复元素的判断和缓存穿透等问题,需要的朋友可以参考下
    2023-11-11
  • java响应式编程之Reactor使用示例解析

    java响应式编程之Reactor使用示例解析

    这篇文章主要为大家介绍了java响应式编程之Reactor使用示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • 微信小程序与Java后端接口交互

    微信小程序与Java后端接口交互

    本文主要介绍了微信小程序与Java后端接口交互,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • SpringBoot集成Redis数据库,实现缓存管理

    SpringBoot集成Redis数据库,实现缓存管理

    SpringBoot2 版本,支持的组件越来越丰富,对Redis的支持不仅仅是扩展了API,更是替换掉底层Jedis的依赖,换成Lettuce。 本案例需要本地安装一台Redis数据库。下面就来看下集成Redis的步骤
    2021-06-06
  • 一文带你看懂SpringBoot中的全局配置文件

    一文带你看懂SpringBoot中的全局配置文件

    这篇文章主要介绍了一文带你看懂SpringBoot中的全局配置文件,全局配置文件能够对一些默认配置值进行修改,Spring Boot使用一个application.properties或者application.yaml的文件作为全局配置文件,需要的朋友可以参考下
    2023-08-08
  • 基于Mybatis-Plus拦截器实现MySQL数据加解密的示例代码

    基于Mybatis-Plus拦截器实现MySQL数据加解密的示例代码

    用户的一些敏感数据,例如手机号、邮箱、身份证等信息,在数据库以明文存储时会存在数据泄露的风险,因此需要进行加密,解密等功能,接下来本文就给大家介绍基于Mybatis-Plus拦截器实现MySQL数据加解密,需要的朋友可以参考下
    2023-07-07

最新评论