LeetCode 2080. 区间内查询数字的频率(哈希+二分查找)

文章目录

    • 1. 题目
    • 2. 解题
      • 2.1 超时解
      • 2.2 优化

1. 题目

请你设计一个数据结构,它能求出给定子数组内一个给定值的 频率

子数组中一个值的 频率 指的是这个子数组中这个值的出现次数。

请你实现 RangeFreqQuery 类:

  • RangeFreqQuery(int[] arr) 用下标从 0 开始的整数数组 arr 构造一个类的实例。
  • int query(int left, int right, int value) 返回子数组 arr[left...right] 中 value 的 频率

一个 子数组 指的是数组中一段连续的元素。arr[left...right] 指的是 nums 中包含下标 left 和 right 在内 的中间一段连续元素。

示例 1:
输入:
["RangeFreqQuery", "query", "query"]
[[[12, 33, 4, 56, 22, 2, 34, 33, 22, 12, 34, 56]], [1, 2, 4], [0, 11, 33]]
输出:
[null, 1, 2]解释:
RangeFreqQuery rangeFreqQuery = new RangeFreqQuery([12, 33, 4, 56, 22, 2, 34, 33, 22, 12, 34, 56]);
rangeFreqQuery.query(1, 2, 4); // 返回 1 。4 在子数组 [33, 4] 中出现 1 次。
rangeFreqQuery.query(0, 11, 33); // 返回 2 。33 在整个子数组中出现 2 次。提示:
1 <= arr.length <= 10^5
1 <= arr[i], value <= 10^4
0 <= left <= right < arr.length
调用 query 不超过 10^5 次。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/range-frequency-queries
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 超时解

  • 存储每个位置的每个数的出现次数的前缀和
class RangeFreqQuery {vector<unordered_map<int,int>> presum;
public:RangeFreqQuery(vector<int>& arr) {presum.reserve(arr.size());presum.emplace_back(unordered_map<int,int>());presum[0][arr[0]] = 1;for(int i = 1; i < arr.size(); ++i){presum.emplace_back(presum.back());if(presum[i-1].find(arr[i]) == presum[i-1].end())presum[i][arr[i]] = 1;elsepresum[i][arr[i]] = presum[i-1][arr[i]]+1;}}int query(int left, int right, int value) {if(presum[right].find(value) == presum[right].end())return 0;if(left == 0 || presum[left-1].find(value) == presum[left-1].end())return presum[right][value];return presum[right][value] - presum[left-1][value];}
};

2.2 优化

  • 记录同一种数字的所有的位置,进行二分查找 left 和 right 的 位置
class RangeFreqQuery {unordered_map<int, vector<int>> pos; // 数字出现的位置
public:RangeFreqQuery(vector<int>& arr) {for(int i = 0; i < arr.size(); ++i){pos[arr[i]].push_back(i);}}int query(int left, int right, int value) {if(pos.find(value) == pos.end()) return 0;auto it1 = lower_bound(pos[value].begin(), pos[value].end(), left);auto it2 = upper_bound(pos[value].begin(), pos[value].end(), right);return it2-it1;}
};

524 ms 245.6 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

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

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

相关文章

java里的super杀意思,java中Super到底是什么意思?必须举例说明!

马克-to-win&#xff0c;Super是一个参考(或说指针)指向他紧邻的父类(见下面的例子)。Super is a reference of its neighbour superclassSo Use super to call superclass’s constructor用super可以指向被隐藏的父类的同名成员。Use super to call superclass’s members tha…

C#中的多文档的使用

1.首先&#xff0c;新建一个窗体&#xff0c;设置窗体的IsMdiContainer true; 窗体的大小为700*600 长700 高600 2.在窗体的Load事件中添加如下代码 private void FormMain_Load(object sender, EventArgs e){Form form new Form();form.FormBorderStyle FormBorderStyle.…

list.php tid= field,dedecms列表页模板中调用当前栏目文章数

此方法适合5.6及5.7 其它未测修改 include/common.func.php文件&#xff0c;在最后加以下代码&#xff1a;//统计栏目文章数function GetTotalArc($tid){global $dsql;$sql GetSonIds($tid);$row $dsql->GetOne("Select count(id) as dd From dede_archives where ty…

LeetCode 1901. 找出顶峰元素 II(二分查找)

文章目录1. 题目2. 解题1. 题目 一个 2D 网格中的 顶峰元素 是指那些 严格大于 其相邻格子(上、下、左、右)的元素。 给你一个 从 0 开始编号 的 m x n 矩阵 mat &#xff0c;其中任意两个相邻格子的值都 不相同 。找出 任意一个 顶峰元素 mat[i][j] 并 返回其位置 [i,j] 。 …

Tracing mysqld Using DTrace

http://dev.mysql.com/doc/refman/5.6/en/dba-dtrace-server.html转载于:https://www.cnblogs.com/zengkefu/p/4900476.html

LeetCode 2085. 统计出现过一次的公共字符串(哈希)

文章目录1. 题目2. 解题1. 题目 给你两个字符串数组 words1 和 words2 &#xff0c;请你返回在两个字符串数组中 都恰好出现一次 的字符串的数目。 示例 1&#xff1a; 输入&#xff1a;words1 ["leetcode","is","amazing","as",&q…

php表白页面,2020情人节表白页面(代码分享)

趁此单身汪伤心之日&#xff0c;作为一名前端程序猿的我也按捺不住了&#xff0c;撸个表白页面送给广大想表白的人儿。话不多说&#xff0c;先看效果(网页地址)&#xff1a;功能一个网页输入名称&#xff0c;生成带参数的网址。浏览器输入该网址&#xff0c;即可打开带有该名字…

matlab玫瑰,网上收到的用matlab画玫瑰花的代码怎么不行啊,报告错误,求大神

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼function plot_rosedraw_main(450,90);function draw_main(x,y)%粉红色玫瑰arcdata{1}[65 -60 150 350 866 -54 300 470 865 -56 30 230 1064 -57 300 490 17];ellipsedata{1}[73 -30 250 450 27 4059 -30 100 290 27 4065 -40 140…

设计类职业

设计类分&#xff1a; 1、视觉&#xff08;2D 3D 2、声音 3、活动 很多时候是三种组合在一起&#xff0c;伴随不同行业延伸发展。 八类设计人才成职场红人 由于人才紧缺&#xff0c;以下八类设计人才已成为职场红人&#xff0c;未来发展前景看好。 1、产品设计师 工业生产型企业…

LeetCode 2086. 从房屋收集雨水需要的最少水桶数(贪心)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的字符串 street 。street 中每个字符要么是表示房屋的 ‘H’ &#xff0c;要么是表示空位的 ‘.’ 。 你可以在 空位 放置水桶&#xff0c;从相邻的房屋收集雨水。 位置在 i - 1 或者 i 1 的水桶可以收集位置为 i 处房…

LeetCode 2087. 网格图中机器人回家的最小代价(脑筋急转弯)

文章目录1. 题目2. 解题1. 题目 给你一个 m x n 的网格图&#xff0c;其中 (0, 0) 是最左上角的格子&#xff0c;(m - 1, n - 1) 是最右下角的格子。 给你一个整数数组 startPos &#xff0c;startPos [startrow, startcol] 表示 初始 有一个 机器人 在格子 (startrow, start…

PAM+4+matlab,基于PAM4调制的400G光模块

PAM4是400G光模块的主要调制方式&#xff0c;有多模和单模两种类型。基于PAM4调制的400G光模块电口侧以8x50G PAM4调制&#xff0c;光口侧则有8x50G PAM4和4x100G PAM4两种调制类型。多模光模块400G多模光模块常见的有SR8和SR4.2接口&#xff0c;皆使用8x50G PAM4调制。400G SR…

LeetCode 2089. 找出数组排序后的目标下标

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的整数数组 nums 以及一个目标元素 target 。 目标下标 是一个满足 nums[i] target 的下标 i 。 将 nums 按 非递减 顺序排序后&#xff0c;返回由 nums 中目标下标组成的列表。 如果不存在目标下标&#xff0c;返回一…

DJANGO,获取当前用户名,用户组名,用户组权限

样例&#xff0c;为下一步自定义用户权限作一下代码准备&#xff1a; def get_context_data(self, **kwargs):if self.request.user.is_authenticated():current_user_set self.request.userprint current_user_setcurrent_group_set Group.objects.get(usercurrent_user_set…

php 获取js对象的属性值,js获取对象,数组所有属性键值(key)和对应值(value)的方法示例...

本文实例讲述了js获取对象,数组所有属性键值(key)和对应值(value)的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;var valuesfunction(object) {var values [];for (var property in object)values.push(object[property]);return values;}//写成标准的方法(数…

LeetCode 2090. 半径为 k 的子数组平均值(滑窗)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的数组 nums &#xff0c;数组中有 n 个整数&#xff0c;另给你一个整数 k 。 半径为 k 的子数组平均值 是指&#xff1a;nums 中一个以下标 i 为 中心 且 半径 为 k 的子数组中所有元素的平均值&#xff0c;即下标在 i …

大龄屌丝自学笔记--Java零基础到菜鸟--036

GUI&#xff1a;继承体系、事件监听机制、适配器模型、Netbeans 1、继承体系 2、事件监听机制 事件源--事件定义&#xff08;接口&#xff09;--事件处理&#xff08;实现类&#xff09;--事件监听 3、适配器模型 接口&#xff08;很多方法&#xff09;--抽象适配器类&#xff…

LeetCode 2091. 从数组中移除最大值和最小值(一次遍历)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的数组 nums &#xff0c;数组由若干 互不相同 的整数组成。 nums 中有一个值最小的元素和一个值最大的元素。分别称为 最小值 和 最大值 。你的目标是从数组中移除这两个元素。 一次 删除 操作定义为从数组的 前面 移除…

php怎么获取分类数,php 两种获取分类树的方法

php 两种获取分类树的方法1./*** 获取分类树* param array $array 数据源* param int $pid 父级ID* param int $level 分类级别* return string*/function getCategory($array, $pid 0, $level 0){//声明静态数组,避免递归调用时,多次声明导致数组覆盖static $list [];foreac…

Java中正数与负数操作、的区别

以下为个人理解&#xff0c;有不对的地方请提出 Java中&#xff0c;>>、>>>都是在数字的二进制的补码中进行的 正数的补码为本身 如33的二进制表示为 00000000 00000000 00000000 00100001 补码为 00000000 00000000 00000000 00100001 负数的补码为符号位即最高…