LeetCode 1109.航班预订统计(差分)

2024-02-05 10:59

本文主要是介绍LeetCode 1109.航班预订统计(差分),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 题目
  • 解题思路:差分
  • Reference


题目

  • 1109. 航班预订统计

在这里插入图片描述

在这里插入图片描述

解题思路:差分

典型的【差分】模板题,只涉及【区间修改 + 单点查询】。

对于数组 [1,2,2,4],其差分数组为 [1,1,0,2],差分数组的第 i 个数即为原数组的第 i-1 个元素和第 i 个元素的差值,也就是说对差分数组求前缀和即可得到原数组

当希望对原数组的某一个区间 [l,r] 施加一个增量 inc \textit{inc} inc 时,差分数组D对应的改变是:D[l] 增加 inc \textit{inc} incD[r+1] 减少 inc \textit{inc} inc

  • D[l] += inc:由于差分是前缀和的逆向过程,这个操作对于将来的查询而言,带来的影响是对于所有的下标大于等于l的位置都增加了值 inc
  • D[r+1] -= inc :由于期望只对[l,r]产生影响,因此需要对下标大于r的位置进行减值操作,从而抵消“影响”

算法流程:

  • 遍历给定的预定记录数组,每次以 O ( 1 ) O(1) O(1)复杂度完成对差分数组的修改即可
  • 完成差分数组的修改后,只需要求出差分数组的前缀和即可得到目标数组
class Solution {public int[] corpFlightBookings(int[][] bookings, int n) {int[] nums = new int[n + 1];for (int[] bs : bookings) {// 本题中日期从 1 开始,因此需要相应的调整数组下标对应关系int l = bs[0] - 1, r = bs[1] - 1, inc = bs[2];nums[l] += inc;nums[r + 1] -= inc;}int[] ans = new int[n];ans[0] = nums[0];for (int i = 1; i < n; i++) {ans[i] = ans[i - 1] + nums[i];}return ans;}
}

空间复杂度优化:

class Solution {public int[] corpFlightBookings(int[][] bookings, int n) {int[] nums = new int[n];for (int[] bs : bookings) {// 本题中日期从 1 开始,因此需要相应的调整数组下标对应关系int l = bs[0] - 1, r = bs[1] - 1, inc = bs[2];nums[l] += inc;// 当 r 为 n 时,无需修改 d[r],因为这个位置溢出了下标范围// 如果求前缀和时考虑该位置,那么该位置对应的前缀和值必定为 0if (bs[1] < n) {nums[r + 1] -= inc;}            }// 求原数组a[]的时候在,推导式子 a[i] = a[i−1] + D[i] 时// 把已经使用过的较小的D[]直接当成a[]即可for (int i = 1; i < n; i++) {nums[i] += nums[i - 1];}return nums;}
}
  • 时间复杂度: O ( n + m ) O(n+m) O(n+m),其中 n n n 为要求的数组长度, m m m 为预定记录的数量。需要对于每一条预定记录处理一次差分数组,并最后对差分数组求前缀和。

  • 空间复杂度: O ( 1 ) O(1) O(1)。只需要常数的空间保存若干变量,注意返回值不计入空间复杂度

再总结一下(加粗字体为最佳方案):

  • 数组不变,区间查询:前缀和、树状数组、线段树;
  • 数组单点修改,区间查询:树状数组、线段树;
  • 数组区间修改,单点查询:差分、线段树;
  • 数组区间修改,区间查询:线段树

注意:上述总结是对于一般性而言的(能直接解决的),对标的是模板问题。但存在经过一些经过“额外”操作,对问题进行转化,从而使用别的解决方案求解的情况。

例如某些问题,可以先对原数组进行差分,然后使用树状数组,也能解决区间修改问题。

或者使用多个树状数组来维护多个指标,从而实现类似线段树的持久化标记操作。

Reference

  • 航班预订统计

  • 【区间求和问题】差分入门模板题

  • 差分-算法竞赛专题解析

这篇关于LeetCode 1109.航班预订统计(差分)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/680704

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

hdu1496(用hash思想统计数目)

作为一个刚学hash的孩子,感觉这道题目很不错,灵活的运用的数组的下标。 解题步骤:如果用常规方法解,那么时间复杂度为O(n^4),肯定会超时,然后参考了网上的解题方法,将等式分成两个部分,a*x1^2+b*x2^2和c*x3^2+d*x4^2, 各自作为数组的下标,如果两部分相加为0,则满足等式; 代码如下: #include<iostream>#include<algorithm

poj 3159 (spfa差分约束最短路) poj 1201

poj 3159: 题意: 每次给出b比a多不多于c个糖果,求n最多比1多多少个糖果。 解析: 差分约束。 这个博客讲差分约束讲的比较好: http://www.cnblogs.com/void/archive/2011/08/26/2153928.html 套个spfa。 代码: #include <iostream>#include <cstdio>#i

poj 3169 spfa 差分约束

题意: 给n只牛,这些牛有些关系。 ml个关系:fr 与 to 牛间的距离要小于等于 cost。 md个关系:fr 与 to 牛间的距离要大于等于 cost。 隐含关系: d[ i ] <= d[ i + 1 ] 解析: 用以上关系建图,求1-n间最短路即可。 新学了一种建图的方法。。。。。。 代码: #include <iostream>#include

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

hdu4267区间统计

题意:给一些数,有两种操作,一种是在[a,b] 区间内,对(i - a)% k == 0 的加value,另一种操作是询问某个位置的值。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import

hdu4417区间统计

给你一个数列{An},然后有m次查询,每次查询一段区间 [l,r] <= h 的值的个数。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamRead

hdu3333区间统计

题目大意:求一个区间内不重复数字的和,例如1 1 1 3,区间[1,4]的和为4。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;