差分数组/前缀和

文章目录

  • 1094. 拼车
  • 1109. 航班预定统计
  • 303. 区域和检索 - 数组不可变
  • 560. 和为K的子数组
  • 523. 连续的子数组的和

1094. 拼车

在这里插入图片描述

class Solution {public boolean carPooling(int[][] trips, int capacity) {int[] diff = new int[1001]; // 记录每个站点改变的人数,比如增加几个人,减少几个人for(int[] trip : trips){int cnt = trip[0];int from = trip[1];int to = trip[2];diff[from] += cnt;diff[to] -= cnt;}int num = 0; // 记录每个站点车上的人数for(int i = 0; i < 1001; i++){num += diff[i];if(num > capacity){return false;}}return true;}
}

1109. 航班预定统计

在这里插入图片描述
在这里插入图片描述
原数组后一位元素 - 前一位元素,得到的就是差分数组

通过差分数组求前缀和,可以得到原数组。对原数组区间[l, r]增加inc,相当于对差分数组的diff[l] += inc,diff[r + 1] -= inc

class Solution {public int[] corpFlightBookings(int[][] bookings, int n) {int[] diff = new int[n];int m = bookings.length;for(int i = 0; i < m; i++){int l = bookings[i][0];int r = bookings[i][1];int cnt = bookings[i][2];diff[l - 1] += cnt;if(r < n) diff[r] -= cnt;}for(int i = 1; i < n; i++){diff[i] += diff[i - 1];}return diff;}
}

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

在这里插入图片描述

我们对原数组的[l, r]区间求和,可以转换为前缀和数组的差:pre[r] - pre[l - 1]

对前缀和求差分数组,可以得到原数组
对差分数组求前缀和,也可以得到原数组

class NumArray {int n;int[] pre;public NumArray(int[] nums) {n = nums.length;pre = new int[n];pre[0] = nums[0];for(int i = 1; i < n; i++){pre[i] = pre[i - 1] + nums[i];}}public int sumRange(int l, int r) {if(l == 0) return pre[r];return pre[r] - pre[l - 1];}
}

560. 和为K的子数组

在这里插入图片描述

class Solution {public int subarraySum(int[] nums, int k) {// 也就是前缀和数组两数之差为kint n = nums.length;int[] pre = new int[n];pre[0] = nums[0];for(int i = 1; i < n; i++){pre[i] = pre[i - 1] + nums[i];}int ans = 0;// presum, cntHashMap<Integer, Integer> map = new HashMap<>();map.put(0, 1);   // 表示pre[i]就是k,即[0,i]和为kfor(int i = 0; i < n; i++){if(map.containsKey(pre[i] - k)){ans += map.get(pre[i] - k);}map.put(pre[i], map.getOrDefault(pre[i], 0) + 1);}return ans;}
}

523. 连续的子数组的和

在这里插入图片描述
若区间和为k的整数倍,说明前缀和数组两个元素的差应该是k的整数倍,也即每个元素%k后,余数相同。余数相同,则表示两数之差是k的整数倍

class Solution {public boolean checkSubarraySum(int[] nums, int k) {int n = nums.length;int[] pre = new int[n];pre[0] = nums[0];for(int i = 1; i < n; i++){pre[i] = pre[i - 1] + nums[i];}HashMap<Integer, Integer> map = new HashMap<>();map.put(0, -2); // 如果前缀和数组 某个数 % k 的余数就是0,说明[0, i]区间的和就是k的整数倍,下标设置为-2for(int i = 0; i < n; i++){if(map.containsKey(pre[i] % k)){if(i > 0 && i - map.get(pre[i] % k) >= 2){// 同余的同时,还需要满足i > 0,因为i == 0时数组长度是1return true;}}else{// 余数已经出现过了,就不再更新了map.put(pre[i] % k, i);}}return false;}
}

总结:

差分数组主要是把对原数组某个区间的操作,转换为对两端点的操作,[l, r] -> l, r + 1

前缀和数组可以把对原数组[l, r]区间求和的操作,转化为两端点的差pre[r] - pre[l - 1]

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

R语言和Python用泊松过程扩展:霍克斯过程Hawkes Processes分析比特币交易数据订单到达自激过程时间序列...

全文下载链接&#xff1a;http://tecdat.cn/?p25880 本文描述了一个模型&#xff0c;该模型解释了交易的聚集到达&#xff0c;并展示了如何将其应用于比特币交易数据。这是很有趣的&#xff0c;原因很多。例如&#xff0c;对于交易来说&#xff0c;能够预测在短期内是否有更多…

融合MMEdu和Transformers技术的视障出行智能辅助系统(上海浦育AI未来夏令营结题论文)

融合MMEdu和Transformers技术的视障出行智能辅助系统 摘要 面对社会生活中众多视障者对出行的需求&#xff0c;视障出行智能辅助系统融合MMEdu和Transformers技术为视障者提供实时路况分析。本系统利用图像分类、目标检测和深度估计等软件技术&#xff0c;对摄像头实时获取的每…

【C++】异常处理详解

本篇文章重点将会对C中的异常的相关处理操作进行详解。希望本篇文章的内容会对你有所帮助。 目录 一、C语言的异常处理 二、C异常 2、1 异常概念 2、2 异常的使用 2、3 异常类 2、4 异常的重新抛出 三、异常的安全与规范 3、1 异常的安全 3、2 异常的规范 四、异常的优缺点 &am…

数据通信——传输层TCP(可靠传输机制的滑动窗口)

引言 之前提到过拥塞问题&#xff0c;如果大量数据疯狂涌入&#xff0c;接收端无法及时处理就会导致数据丢包&#xff0c;从而使得通信受到干扰。之前的连续ARQ如果不加以节制&#xff0c;疯狂发送报文&#xff0c;接收端无法及时返回ACK就会导致网络瘫痪。 滑动窗口机制协议 这…

C++实现蜂群涌现效果(flocking)

Flocking算法0704_元宇宙中的程序员的博客-CSDN博客 每个个体的位置&#xff0c;通过计算与周围个体的速度、角度、位置&#xff0c;去更新位置。

WPF+Prism+WebApi 学习总结

一、基本概念 WPF:WPF&#xff08;Windows Presentation Foundation&#xff09;是&#xff08;微软推出的&#xff09;基于Windows的用户界面框架&#xff0c;提供了统一的编程模型&#xff0c;语言和框架&#xff0c;做到了分离界面设计人员与开发人员的工作&#xff1b;WPF…

音频——硬件拓扑

文章目录 硬件拓扑I2S 数据通路五线模式四线模式两线 TX两线 RX 典型应用硬件连接数据流 硬件拓扑 控制路径&#xff1a;UART/I2C/SPI数据路径&#xff1a;I2S 简略图如下 I2S 数据通路 五线模式 四线模式 两线 TX 两线 RX 典型应用 硬件连接 控制信号&#xff1a;SPI 用…

数据结构体--5.0图

目录 一、定义 二、图的顶点与边之间的关系 三、图的顶点与边之间的关系 四、连通图 五、连通图的生成树定义 一、定义 图&#xff08;Graph&#xff09;是由顶点的又穷非空集合合顶点之间边的集合组成&#xff0c;通常表示为&#xff1a;G&#xff08;V&#xff0c;E&…

linux C编程 获取系统时间

1.clock_gettime #include<time.h> int clock_gettime(clockid_t clk_id,struct timespec *tp); struct timespec {time_t tv_sec; /* 秒*/long tv_nsec; /* 纳秒*/ }clk_id : CLOCK_BOOTTIME&#xff0c;以系统启动时间为时间原点的时间体系&#xff0c;不受其它因素的…

Ei Scopus 双检索 |第三届信息与通信工程国际会议国际会议(JCICE 2024)

会议简介 Brief Introduction 2024年第三届信息与通信工程国际会议国际会议(JCICE 2024) 会议时间&#xff1a;2024年5月10日-12日 召开地点&#xff1a;中国福州 大会官网&#xff1a;JCICE 2024-2024 International Joint Conference on Information and Communication Engin…

前端面试中Vue的有经典面试题一

1. 谈谈你对MVVM开发模式的理解 MVVM分为Model、View、ViewModel三者。 Model&#xff1a;代表数据模型&#xff0c;数据和业务逻辑都在Model层中定义&#xff1b; View&#xff1a;代表UI视图&#xff0c;负责数据的展示&#xff1b; ViewModel&#xff1a;负责监听Model中…

业务需要咨询?开发遇到 bug 想反馈?开发者在线提单功能上线!

大家是否遇到过下列问题—— 在开发的时候&#xff0c;遇到 bug 需要反馈… 有合作意向的时候&#xff0c;想更多了解业务和相关产品… 在接入的时候&#xff0c;需要得到专业技术支持… 别急&#xff0c;荣耀开发者服务平台在线提单功能上线了~ 处理问题分类说明&#xff1…