差分数组实战——滴滴春招笔试第一题

前言

作者:晓宜
🌈🌈🌈
个人简介:互联网大厂Java准入职,阿里云专家博主,csdn后端优质创作者,算法爱好者
🌙🌙🌙
上周末参与了滴滴的春招笔试,第一题是差分数组的改版题,但是测试数据不强,听同学说暴力遍历也能过,whatever,这里分享下两种解法,顺便讲解下差分数组
❤️❤️❤️
你的关注是我前进的动力😊

题目描述:

小明正在模拟陨石对地质的危害。在小明的模型下,将地面从0,1,2…直到N依次从左到右进行标号。每次陨石i坠落,会使得标号在[L,R]这个区间范围内的地面受到一次陨石打击。

在 M 次陨石坠落后,小明想知道某些指定地面在刚才 M 次陨石坠落中受到了多少次陨石打击。

输入描述:

第一行两个正整数 N,M,含义如题面,
接下来一行 M 个数,分别为L1,L2,…,Ln表示这M次陨石打击的左边界。
接下来一行 M 个数,分别为R1,R2,…,Rn,表示这M次陨石打击的右边界。
接下来一个数 Q,表示小明询同次数。
接下来一行Q个数x,表示小明想知道标号为x的地面在刚才M次阳石坠落中受到了多少次打击。

输出描述:

输出一行 Q 个数,用空格隔开(无行未空格),分别表示每次询问的答案。
示例:

输入:

4 3
1 2 2
2 3 4
5
0 1 2 3 4

输出:

0 1 2 3 4

思路

我们先介绍一种朴素的思想,对于每一次陨石掉落,我们把那个区间所有的数都加1,在查询阶段直接返回这个数的值。
这么做显然是正确的,但是考虑到每一次输入都要遍历特定区间,这么做的时间复杂度是 o ( n 2 ) o(n^2) o(n2)
在笔试中可以考虑先把这种写法实现,看看过了多少测试用例,就本题目而言,这种暴力法可以ak。

暴力代码:

N,M = map(int,input().split(" "))
left = [int(v) for v in input().split(" ")]
right = [int(v) for v in input().split(" ")]ans = [0 for i in range(N+1)]
for i in range(M):for j in range(left[i],right[i]+1):ans[j] += 1q = int(input())
x = [int(v) for v in input().split(" ")]
for i in x:print(ans[i],end = " ")

我们可以优化上述逻辑中的每次输入给这一区间中所有数加1的这一逻辑,具体做法如下:

  1. 假设我们经过修改后的数组是 num
  2. 建立一个差分数组dif,定义: d i f [ i ] = n u m [ i ] − n u m [ i − 1 ] dif[i] = num[i] - num[i-1] dif[i]=num[i]num[i1]
  3. 此时我们发现一个关系,就是 n u m [ i ] = ∑ j = 0 i d i f [ j ] num[i] = \sum_{j=0}^{i} dif[j] num[i]=j=0idif[j],即num[i]等于dif[i]的前缀和,具体证明的话大家可以把 dif 按照定义展开,发现前缀和中除了第一项 num[i] 其他都被消掉了
  4. 基于这样的公式,我们可以一开始只修改 dif 数组,最后遍历一遍 dif 数组,然后就可以得到 num数组了

差分数组代码

N,M = map(int,input().split(" "))
left = [int(v) for v in input().split(" ")]
right = [int(v) for v in input().split(" ")]dif = [0 for i in range(N+2)]
for i in range(M):dif[left[i]] += 1dif[right[i]+1] -= 1ans = []
cur = 0
for i in range(N+2):cur += dif[i]ans.append(cur)q = int(input())
x = [int(v) for v in input().split(" ")]
for i in x:print(ans[i],end = " ")

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

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

相关文章

二叉树的初步学习和顺序结构实现

当我们学完顺序表、链表、栈和队列的时候,我们就要开始学习树了。树对于以后的学习有非常大的帮助,尤其是排序。好了,开始我们的学习吧。 1.树的概念及结构 1.1树的结构 树结构是一种非线性结构。它是由n(n>0)个…

CHINC邀请函 | 全视通邀您共赴青岛,碰撞数智火花

展会名称:2024中华医院信息网络大会(CHINC) 展会时间:3月29-31日 展会地址:青岛国际会展中心(红岛馆) 全视通展位:B2-A05A 全视通将携智慧病区、智慧门诊、智慧手术室、智慧后勤…

lua profile 性能分析工具都有哪些

在 Lua 中,性能分析(profiling)是一个关键步骤,用于找出代码中的瓶颈和优化机会。通过性能分析,你可以了解哪些函数或代码段占用了最多的执行时间,从而可以优先优化这些部分。 Lua 本身并没有内置的性能分…

UnityShader(十七)透明效果

前言: 在实时渲染中实现透明效果,通常会在渲染模型时控制它的透明通道(Alpha Channel)。当开启透明混合后,一个物体被渲染到屏幕上时每个片元除了颜色值和深度值外,还有一个透明值,1表示像素完…

汽车信息安全--安全调试功能在量产后是否必须禁用(2)

目录 1.引入 2 响应挑战解锁的两种实现 3.Debug via Commnucation 4.小结 1.引入 上一篇文章,

快速实现鸿蒙侧边栏显示与隐藏

文章目录 前言侧边栏组件使用快速搞定侧边栏总结 一、前言 有好多文章要分享,但是来不及,就把最近觉得比较重要的组件分享下。最近因为在完善玩android的一个app,我的这个app叫玩鸿蒙,过段时间就开源了,敬请期待。 …

免费开源的 Vue 拖拽组件 VueDraggablePlus (兼容移动端)

VueDraggablePlus 支持 Vue2 / Vue3,是被尤雨溪推荐了的拖拽组件。我自己试用过了,还挺好用的,兼容移动端。 官网:https://alfred-skyblue.github.io/vue-draggable-plus/ 官网文档里面很详细了,我就不再介绍安装和用…

香港服务器被大流量攻击了怎么办?

面对香港服务器遭受大流量攻击,以下是一些应对措施: 增加带宽和网络资源:尽快增加服务器的带宽和网络资源,以应对攻击造成的流量压力。 使用DDoS防护服务:考虑使用专业的DDoS(分布式拒绝服务)防护服务,这些…

GPU服务器与普通服务器之间的差异

众所周知,服务器是网络中的重要设备,要接受少至几十人、多至成千上万人的访问,因此对服务器具有大数据量的快速吞 吐、超强的稳定性、长时间运行等严格要求。但是,今天我们了解的是GPU服务器,很明显,从字面…

Google colab中如何从kaggle中接入数据?

写在前面 使用google colab进行数据分析和探索时,可引用的数据源包括但不限于:1.可上传的数据文件用本地加载的的方式打开数据资源;2.从网络链接中直接打开后加载到缓存中的文件资源;3.通过API或者外部的开放接口加载数据&#x…

【日本語】N2考试湖北报名笔记

阅读资料 视频:JLPT报名技巧 使用浏览器调试模式快速报名; 1 报名流程 【考场选择】 1.1 春季报名:03-19 07:00:00 1.2 预习网站登录信息 1.3 登录验证码:06:55 (图片来自视频《教日语的阿飞老师 - 担心能力考抢…

微信小程序选择器picker的使用(省市区)

index.wxml picker中的 moderegion模式&#xff0c;这里同element中的select不同的是&#xff0c;不需要自己在绑定数据原&#xff0c;默认就包含了省市区的整体数据 <view class"section"><view class"section__title">省市区选择器</vie…

【源码阅读】Mybatis底层源码分析(详细Debug查看附代码)

一、搭建测试代码框架 &#xff08;代码已提交到github->测试代码&#xff0c;建议结合代码根据本文debug一遍更有利于理解&#xff0c;帮忙点个Star 哈&#xff0c;本人在这里谢谢了&#xff09; 二、猜想Mybatis是如何设计的 从上面的案例中&#xff0c;可以大致可以猜测…

酷开科技以酷开系统的力量让电视机“活”起来

让用户回归电视的绝不会是因为电视机本身&#xff0c;而是电视系统的内容和交互的形式。酷开科技以系统的力量让电视机“活”起来。对于许多人来说&#xff0c;观看电影是一种享受、一种放松、一种逃避现实的方式。而现在&#xff0c;酷开科技作为行业内领军企业&#xff0c;为…

YOLOV5 部署:QT的可视化界面推理(创建UI,并编译成py文件)

1、前言 之前用YOLOV5 做了一个猫和老鼠的实战检测项目,本章将根据之前训练好的权重进行部署,搭建一个基于QT的可视化推理界面,可以检测图片和视频 本章使用的数据集和权重参照:YOLOV5 初体验:简单猫和老鼠数据集模型训练-CSDN博客 可视化界面如下: 2、安装Pyside6 本…

JSONP漏洞详解

目录 同源策略 JSONP简介 JSONP劫持漏洞 漏洞原理 漏洞利用过程 利用工具 JSONP漏洞挖掘思路 JSONP防御 首先&#xff0c;要了解一下什么是同源策略&#xff1f; 同源策略 同源策略&#xff08;SOP&#xff09;是浏览器的一个安全基石&#xff0c;浏览器为了保证数据…

碳课堂|什么是碳减排?如何减少碳排放?

一、碳减排的定义及提出背景&#xff1a; 碳减排&#xff0c;即减少人类在生产、生活中二氧化碳&#xff08;CO2&#xff09;等温室气体的排放量&#xff0c;以应对全球气候变暖。 18世纪工业革命起&#xff0c;人类在生产活动中使用大量矿物燃料&#xff08;如煤、石油等&am…

从电子邮件到即时通讯:信息技术演变与现代沟通方式的变迁

上世纪90年代&#xff0c;欧美企业界迎来了信息化建设的大爆发时期。Oracle、SAP和Adobe等国际知名软件巨头纷纷致力于推广和普及电子邮件系统&#xff0c;使电子邮件迅速成为企业和个人进行信息交换的主要工具之一。电子邮件的出现&#xff0c;也提供了一种高效的信息传递手段…

zookeeper集群安装部署和集群异常处理

准备jdk和zookeeper安装包【官网即可下载】 zookeeper-3.5.1-alpha.tar.gz jdk1.7.0_8020200612.tar 准备三台linux虚拟机【具体以项目实际需要为准】&#xff0c;并安装jdk和zookeeper 虚拟机地址如下&#xff1a;194.1.1.86&#xff08;server.1&#xff09;、194.1.1.74…

阿里云-云服务器ECS新手如何建网站?

租阿里云服务器一年要多少钱&#xff1f; 不同类型的服务器有不同的价格。 以ECS计算型c5为例&#xff1a;2核4G-1年518.40元&#xff0c;4核8G-1年948.00元。 阿里云ECS云服务器租赁价格由三部分组成&#xff1a; 也就是说&#xff0c;云服务器配置成本磁盘价格网络宽带价格…