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.…

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

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

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;即可打开带有该名字…

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 中有一个值最小的元素和一个值最大的元素。分别称为 最小值 和 最大值 。你的目标是从数组中移除这两个元素。 一次 删除 操作定义为从数组的 前面 移除…

LeetCode 2092. 找出知晓秘密的所有专家(并查集)

文章目录1. 题目2. 解题1. 题目 给你一个整数 n &#xff0c;表示有 n 个专家从 0 到 n - 1 编号。 另外给你一个下标从 0 开始的二维整数数组 meetings &#xff0c;其中 meetings[i] [xi, yi, timei] 表示专家 xi 和专家 yi 在时间 timei 要开一场会。 一个专家可以同时参加…

python web开发 HTML基础

文章目录1. 简介2. 标签元素属性3. 表格4. 列表ol 有序ul 无序自定义列表5. 表单输入域标记 input选择域标记 select, option文字域标记 textarea6. 综合练习learning from 《python web开发从入门到精通》 1. 简介 HTML 是描述网页的一种标记语言&#xff0c;Hyper Text Mar…

美团大众点评合并:背后技术力量的对比回顾

美团网和大众点评网在10月8日中午联合发布声明&#xff0c;宣布达成战略合作&#xff0c;两者将共同成立一家新公司。两者也在InfoQ及其组织的大会上进行过多次分享&#xff0c;我们将对美团和大众点评使用的技术进行回顾&#xff0c;来看看这两家电商巨头的技术实力。 美团和大…

python web开发 CSS基础

文章目录1. 基础知识2. ID&#xff0c;Class 选择器3. CSS盒子模型4. 嵌入CSS样式4.1 内联样式表4.2 内部样式表4.3 外部样式表learning from 《python web开发从入门到精通》 1. 基础知识 CSS &#xff0c;Cascading Style Sheet 层叠样式表&#xff0c;标记语言&#xff0c…

python web开发 JavaScript基础

文章目录1. script 标签2. 字面量、变量3. 数据类型4. 运算符5. if 条件6. switch分支7. for循环8. while循环9. break&#xff0c; continue10. 函数11. JS事件12. 引入JS的两种方式12.1 HTML页面嵌入12.2 引入外部JS文件learning from 《python web开发从入门到精通》 JavaS…

python web开发 jQuery基础

文章目录1. 引入 jQuery2. 基本语法3. jQuery 选择器3.1 元素选择器3.2 #id 选择器3.3 .class 选择器4. jQuery事件5. 获取内容和属性5.1 获取内容5.2 获取属性learning from 《python web开发从入门到精通》 jQuery 是一个轻量级的 JavaScript 函数库包含 元素选取&#xff0…