1906. 查询差绝对值的最小值
题目地址(1906. 查询差绝对值的最小值)
https://leetcode-cn.com/problems/minimum-absolute-difference-queries/
题目描述
前置知识
前缀和
离散化
公司
暂无
思路
由于需要查询任意区间 [ql,qr] 的差的最小值。因此一种简单的思路是对 nums 进行一次排序,之后遍历 [ql,qr] 的所有相邻差,并取最小的即可。这种做法时间复杂度为排序 $nlogn$ + 查询 $n^2$,代入题目数据范围 $2 <= nums.length <= 10^5$,则必然超时。
一种优化的思路是对 nums 的数据进行离散化,即将值映射到一个大小为 nums 值域大小的数组(由于 1 <= nums[i] <= 100 ,因此对于这道题来说至于大小就是 100)。这样通过遍历值域数组就可以得到最小绝对值差。由于值域大小最多是 100,相比于 $10^5$ 是巨大优化。
不过值域数组不含索引信息,因此我想求区间 [ql,qr] 的差的最小值则无法直接做到,我们只能求区间 [0,n-1] 的差的最小值。
那怎么办呢?
我们建立 n 个值域数组,即对每一个索引 i 都建立一个值域数组。这样区间 [ql,qr]的值就可以通过前缀和求得。比如 :
v 就是 i 在 [ql,qr] 的出现次数。
也就是说我们可以建议二维数组 pre[i][j] 表示数组 nums 前 i 项 j 出现的次数,这样可以通过前缀和求出任意区间任意数出现次数。
剩下的就容易了,具体参考下方代码。
这种做法本质上空间换时间,即使用值域的空间大小换取嵌套 n 循环的实际,是一种典型的取舍。也就是说如果题目值域很大,比如 $10^7$ ,那就不适合使用此算法了。
关键点
同时对索引和值建立前缀和,即建立二维前缀和
代码
语言支持:Python3
Python3 Code:
复杂度分析
令 n 为数组长度,q 为 queries 长度,v 为 nums 取值范围(这里是 100)。
时间复杂度:$O(nvq)$
空间复杂度:$O(nv)$
此题解由 力扣刷题插件 自动生成。
力扣的小伙伴可以关注我,这样就会第一时间收到我的动态啦~
以上就是本文的全部内容了。大家对此有何看法,欢迎给我留言,我有时间都会一一查看回答。更多算法套路可以访问我的 LeetCode 题解仓库:https://github.com/azl397985856/leetcode 。 目前已经 40K star 啦。大家也可以关注我的公众号《力扣加加》带你啃下算法这块硬骨头。
关注公众号力扣加加,努力用清晰直白的语言还原解题思路,并且有大量图解,手把手教你识别套路,高效刷题。
最后更新于