[leetcode]1109. 航班预订统计(击败100%用户算法-差分数组的详解)

执行用时2ms,击败100%用户
内存消耗52.1MB,击败91%用户
这也是我第一次用差分数组,之前从来没有碰到过,利用差分数组就是利用了差分数组在某一区间内同时加减情况,只会改变最左边和最右边+1的位置上的值。区间最左边同步加减,区间最右边同步加减其相反数。
例如有一原始数组为[2,5,4,7,10,1]
获得的差分数组为[2,3,-1,3,3,-9]
第一步:0-3区间的同步加6
则此时原始数组为[2+6,5+6,4+6,7+6,10,1]
获得的差分数组为[2+6,3,-1,3,3-6,-9]
第二步:2-4区间的同步加3
则此时原始数组为[2+6,5+6,4+6+3,7+6+3,10+3,1]
获得的差分数组为[2+6,3,-1+3,3,-3,-9-3]
可以看出其规律,差分数组对应d[i]=a[i]+a[i-1]
且如果在[m,n]区间同时相加x,那么在差分数组内只有最左边的边缘a改变同步加减,即d[m]=a[m]+x-a[m-1]=(a[m]-a[m-1])+x=d[m]+x
而最右边加了一个数,因为最右边加一的位置会产生变化,即d[n]=a[n]-(a[n-1]+x)=d[n]-x
因此在此题中,只需将其初始化为0的差分数组,然后对应相加减即可。
普通未优化的差分数组
class Solution {
public int[] corpFlightBookings(int[][] bookings, int n) {
int [] anser = new int[n];
for (int i=0;i<bookings.length;i++){
anser[bookings[i][0]-1] +=bookings[i][2];
if (bookings[i][1]<=n-1){
anser[bookings[i][1]] -= bookings[i][2];
}
}
// for (int i=1;i<n;i++){
// anser[i]=anser[i]+anser[i-1];
// }
for (int i =0;i<n;i++){
if (i==0){
}else {
anser[i]=anser[i]+anser[i-1];
}
}
return anser;
}
}
此时在while循环中需要大量的判断,因此用空间换时间,新建差分数组是我们对留两个,一个留给0的位置,一个留给n+1的位置,这样边间的处理也都在while循环中,结束后再进行重新的赋值,此时时间复杂度最低!
class Solution {
public int[] corpFlightBookings(int[][] bookings, int n) {
int [] anser = new int[n+2];
int [] anser2 = new int[n];
for (int i=0;i<bookings.length;i++){
anser[bookings[i][0]] +=bookings[i][2];
anser[bookings[i][1]+1] -= bookings[i][2];
}
for (int i =0;i<n;i++){
anser[i+1] = anser[i]+anser[i+1];
}
for (int i=1;i<=n;i++){
anser2[i-1]=anser[i];
}
return anser2;
}
}
[leetcode]1109. 航班预订统计(击败100%用户算法-差分数组的详解)的更多相关文章
- 【转】MySQL用户管理及SQL语句详解
[转]MySQL用户管理及SQL语句详解 1.1 MySQL用户管理 1.1.1 用户的定义 用户名+主机域 mysql> select user,host,password from mysq ...
- Linux用户、用户组权限管理详解 --- 02
2,用户.用户组管理操作详解: 2.1 adduser 添加用户: adduser [-u uid][-g group][-d home][-s shell] -u:直接给出userID ...
- NO29 用户提权sudo配置文件详解实践--志行为审计
用户提权sudo配置文件详解实践: 放到visudo里: 验证权限:
- 微信企业向用户银行卡付款API开发详解(PHP)
最近在实现微信企业向用户银行卡付款时遇到了一些问题,发现官方文档说的太笼统,走了不少弯路,想要在此记录,希望可以帮到大家. 案例:企业付款到银行卡 微信接口链接:https://api.mch. ...
- Spring Security教程(八):用户认证流程源码详解
本篇文章主要围绕下面几个问题来深入源码: 用户认证流程 认证结果如何在多个请求之间共享 获取认证用户信息 一.用户认证流程 上节中提到Spring Security核心就是一系列的过滤器链,当一个请求 ...
- Linux用户、用户组权限管理详解
Linux用户管理三个重要文件详解: Linux登陆需要用户名.密码./etc/passwd 文件保存用户名.登录Linux时,Linux 先查找 /etc/passwd 文件中是否有这个用户名,没有 ...
- vsftpd 配置用户及根目录及其参数详解
vsftpd 常用功能参数配置及参数详解 Table of Contents 1. 配置超级服务 2. 配置匿名用户 3. 配置本地用户登录 4. 配置虚拟用户登录 5. 使用SSL登入 6. 日志文 ...
- 支撑5亿用户、1.5亿活跃用户的Twitter最新架构详解及相关实现
如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 摘要:Twitter出道之初只是个奋斗在RoR上的小站点,而如今已拥有1.5亿的活跃 ...
- Linux用户态程序计时方式详解
前言 良好的计时器可帮助程序开发人员确定程序的性能瓶颈,或对不同算法进行性能比较.但要精确测量程序的运行时间并不容易,因为进程切换.中断.共享的多用户.网络流量.高速缓存访问及转移预测等因素都会对程序 ...
随机推荐
- shell编程-ssh免交互批量分发公钥脚本
脚本基本原理 1.控制端免交互创建秘钥和公钥: 1 ssh-keygen -t rsa -f /root/.ssh/id_rsa -N "" 2.免交互发送公钥 1 sshpass ...
- WebAssembly正逐渐成为FaaS的主力
相信很多人都知道PaaS(平台即服务)和IaaS(基础设施即服务).而随着云计算时代的发展,逐渐出现了大量的XaaS形式的概念,这些技术从原先的硬件服务器,虚拟化服务,再到容器化逐渐转变.使得软件发布 ...
- C++第四十一篇 -- 安装成功的第一个驱动文件
参考链接:https://blog.csdn.net/LEON1741/article/details/87291839 一.新建工程 二.写一个Driver.c #include <ntddk ...
- jvm源码解读--08 创建oop对象,将static静态变量放置在oop的96 offset处
之前分析的已经加载的.Class文件中都没有Static 静态变量,所以也就没这部分的解析,自己也是不懂hotspot 将静态变量放哪里去了,追踪源码之后,看清楚了整个套路,总体上来说,可以举例来说对 ...
- ifix历史数据(H04/H08/H24)转换为CSV文件导出
在最近的一次环保数据维护中,由于自己疏忽导致数据库中TP值并未有效记录,还好历史趋势有相关记录,问题是我该如何将.H24文件记录导出?在逛论坛后,无意发现一款工具解决了我的燃眉之急-HTD2CSV.e ...
- chanakya
仅供个人娱乐 参考http://www.saulgoodman.cn/HA-Chanakya.html 靶机信息 https://www.vulnhub.com/entry/ha-chanakya,3 ...
- Dubbo 实现一个Route Factory(用于灰度发布)
Dubbo 可以实现的扩展很多, 官方文档在这: https://dubbo.apache.org/zh/docs/v2.7/dev/impls/ (太简单了....) 下面我们实现一个Route F ...
- Sql Server备份表,动态生成表名称
1.常用的数据库备份表语句 SELECT * INTO tableNameNew FROM tableName 2.动态备份表,且备份表名称后面增加三位随机字符和当前日期 1 DECLARE @bak ...
- 小白学习vue第五天-第二弹(全局局部、父子、注册语法糖,script/template抽离模板)
全局组件: 就是注册的位置在实例对象的外面 并且可以多个实例对象使用 而局部: 就是在实例对象的内部注册 父组件和子组件的关系 子组件就是在另一个组件里面注册的组件 组件注册语法糖: 就不用Vue.e ...
- 【网站公告】避免反对百度的限制措施:百度搜索过来的访问会自动禁用js权限
今天下午百度联系我们,发现通过百度搜索访问我们网站的博文时会出现下面反对百度的画面,让我们今天彻底处理好,保证不再出现这种情况. 我们排查后发现是这位博主申请了js权限,添加了下面的反对百度的脚本: ...