程序员面试金典 - 面试题 10.10. 数字流的秩(map/树状数组)

文章目录

    • 1. 题目
    • 2. 解题
      • 2.1 map
      • 2.2 树状数组

1. 题目

假设你正在读取一串整数。每隔一段时间,你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。

请实现数据结构和算法来支持这些操作,也就是说:

  • 实现 track(int x) 方法,每读入一个数字都会调用该方法;

  • 实现 getRankOfNumber(int x) 方法,返回 小于或等于 x 的值的个数。

示例:
输入:
["StreamRank", "getRankOfNumber", "track", "getRankOfNumber"]
[[], [1], [0], [0]]
输出:
[null,0,null,1]提示:
x <= 50000
track 和 getRankOfNumber 方法的调用次数均不超过 2000

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

2. 解题

  • 类似题目:LeetCode 315. 计算右侧小于当前元素的个数(二叉查找树&二分查找&归并排序逆序数总结)

2.1 map

  • map 存储自己的个数,写入时间复杂度 O(log⁡n)O(\log n)O(logn)
  • 读取秩的时候,从前往后遍历加起来(小于等于x的)O(n)O(n)O(n) 时间复杂度
class StreamRank {map<int,int> m;int count = 0;
public:StreamRank() {}void track(int x) {m[x]++;}int getRankOfNumber(int x) {count = 0;for(auto& mi : m){if(x >= mi.first)count += mi.second;elsebreak;}return count;}
};

108 ms 13.9 MB

  • map 存储前面小于等于它的个数,读取秩的时间复杂度 O(log⁡n)O(\log n)O(logn)
  • 插入数以后,需要更新所有的 map 的 value,时间复杂度 O(n)O(n)O(n)
class StreamRank {map<int,int> m;
public:StreamRank() {}void track(int x) {auto it = m.rbegin();for(; it != m.rend(); ++it){if(it->first > x)it->second++;//有比x大的,他们的value(比它小的个数) +1elsebreak;}if(it == m.rend() || (it != m.rend() && it->first == x))m[x]++; // map遍历到头了,x不存在,或者x存在elsem[x] = it->second + 1;//遍历没到头,x不存在,x 的 value = 前一个value + 自己}int getRankOfNumber(int x) {if(m.empty() || x < m.begin()->first)return 0;if(m.count(x))return m[x];auto end = m.upper_bound(x);end--;return end->second;}
};

120 ms 14 MB


2.2 树状数组

上面解法:在 n 次操作下的时间复杂度为 O(n2)O(n^2)O(n2)

如何优化:请看树状数组,一次查询和修改时间复杂度均为 O(log⁡n)O(\log n)O(logn)

class StreamRank {vector<int> v;int N = 50002;
public:StreamRank() {v = vector<int>(N);}void track(int x) {update(x+1, 1);}int getRankOfNumber(int x) {return query(x+1);}//-----树状数组-------int lowbit(int x){return x&(-x);}void update(int i, int delta){for( ; i < N; i += lowbit(i))v[i] += delta;}int query(int i){int sum = 0;for( ; i > 0; i -= lowbit(i))sum += v[i];return sum;}
};

44 ms 20.6 MB

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

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

相关文章

python常用函数的用法_python中常用函数整理

1、map map是python内置的高阶函数&#xff0c;它接收一个函数和一个列表&#xff0c;函数依次作用在列表的每个元素上&#xff0c;返回一个可迭代map对象。 class map(object):""" map(func, *iterables) --> map objectMake an iterator that computes the…

.NET中得到计算机硬件信息

VB.NET中得到计算机硬件信息 本文汇集了在.net中得到计算机硬件信息的一些功能。 得到显示器分辨率 Dim X As Short System.http://dev.21tx.com/os/windows/" target"_blank">Windows.Forms.Screen.PrimaryScreen.Bounds.Width Dim Y As Short System.…

diffusion新高度!可一次性生成200张图??

文 | Pine 明敏&#xff08;凹非寺&#xff09;源 | 量子位给AI一个提示词&#xff0c;一次性出200张图&#xff01;生成速度嗖嗖的&#xff0c;不到3分钟全搞定。喜欢哪张任君挑选&#xff0c;还能直接二次调整编辑。咱就是说&#xff0c;这回用AI画画&#xff0c;终于不废人了…

转正

三个月的时间悄悄的溜走这也是我走出学校之前与社会的一段磨合期感觉自己是幸运的因为在我身边总是可以遇到很多很好的朋友一起陪伴着走过风风雨雨或许生活是残酷的或许我们总是会遇到这样那样不如意的事情但是只要我们勇敢的去面对雨后的天空总会有绚丽的彩虹不要埋怨命运因为…

程序员面试金典 - 面试题 17.09. 第 k 个数(set优先队列/DP)

1. 题目 有些数的素因子只有 3&#xff0c;5&#xff0c;7&#xff0c;请设计一个算法找出第 k 个数。 注意&#xff0c;不是必须有这些素因子&#xff0c;而是必须不包含其他的素因子。 例如&#xff0c;前几个数按顺序应该是 1&#xff0c;3&#xff0c;5&#xff0c;7&…

python怎么封装供java调用_python调用第三方java包实例

先看结果&#xff1a;对于python与java的互调&#xff0c;我一开始是用的py4j,但是后来发现在使用方法的时候&#xff0c;不知道如何在python中导入jar包&#xff0c;然后网上的资料也比较少。后来想不出来办法&#xff0c;又看到有Jpype这个东东。博友们说Jpype的安装比较不好…

推特大裁员后,马斯克与白宫发生冲突!META 大批裁员正在路上

文 | 天于刀刀他来了他来了&#xff01;他带着他的裁员方案走来了&#xff01;带着他的水槽 sink in 的第一天&#xff0c;全球打工人的目光不由自主地聚焦于这个神奇的男人身上&#xff1a;paypal 帮派元老&#xff0c;特斯拉 starlink 创始人&#xff0c;埃隆火星人马斯克&am…

*如何循序渐进向DotNet架构师发展(转)

微软的DotNet开发绝对是属于那种入门容易提高难的技术。而要能够成为DotNet架构师没有三年或更长时间的编码积累基本上是不可能的。特别是在大型软件项目中&#xff0c;架构师是项目核心成员&#xff0c;承上启下&#xff0c;因此RUP方法论也认同以架构为核心&#xff0c;体现4…

如何利用python整合excel_使用 Python 合并多个格式一致的 Excel 文件(推荐)

一 问题描述 最近朋友在工作中遇到这样一个问题&#xff0c;她每天都要处理如下一批 Excel 表格&#xff1a;每个表格的都只有一个 sheet&#xff0c;表格的前两行为表格标题及表头&#xff0c;表格的最后一行是相关人员签字。最终目标是将每个表格的内容合并到一个 Excel 表格…

程序员面试金典 - 面试题 17.07. 婴儿名字(并查集)

1. 题目 每年&#xff0c;政府都会公布一万个最常见的婴儿名字和它们出现的频率&#xff0c;也就是同名婴儿的数量。 有些名字有多种拼法&#xff0c;例如&#xff0c;John 和 Jon 本质上是相同的名字&#xff0c;但被当成了两个名字公布出来。 给定两个列表&#xff0c;一个…

神经网络的简单偏好

文 | 许志钦知乎&#xff08;已授权&#xff09;源 | 天天机器学习作者注记我是2017年11月开始接触深度学习&#xff0c;至今刚好五年。2019年10月入职上海交大&#xff0c;至今三年&#xff0c;刚好第一阶段考核。2022年8月19号&#xff0c;我在第一届中国机器学习与科学应用大…

电影的音乐

Yann Tiersen,法国代表作&#xff1a;《天使爱美丽》《再见&#xff0c;列宁》 对于大家来说&#xff0c;一提到扬蒂尔森(Yann Tiersen)想到的便是《天使爱美丽》。的确《天使爱美丽》使这位法国音乐人一夜成为世界注目的艺术家。在我看来《天使爱美丽》的导演让皮埃尔热内(Jea…

python 列表写入csv_Python将字典数据写入CSV文件

# -*- coding: utf-8 -*- import os import time import csv class WriteCSV(): """定义成员变量""" def __init__(self): pass def init(self, info_list, info_dict_list): self.info_list info_list self.info_dict_list info_dict_list de…

数据结构--并查集(Disjoint-Set)

文章目录1. 并查集2. 操作2.1 初始化2.2 查询2.3 合并2.4 孤立3. 完整代码4. 相关题目5. 参考1. 并查集 并查集是一种树型的数据结构用于处理一些不相交集合&#xff08;Disjoint Sets&#xff09;的合并及查询问题 2. 操作 2.1 初始化 把每个点所在集合初始化为其自身&…

推特裁员大反转!马斯克哭求被裁员工回来

编 | Aeneas 好困源 | 新智元马斯克裁完一半员工后&#xff0c;发现推特运转不了了&#xff0c;现在正哭求一些人回来&#xff0c;堪称爽文情节了。打脸大戏来了&#xff01;马斯克在上周五「灭掉」一半员工后&#xff0c;就后悔了。现在公司正在紧急联系数十名被裁的员工&…

Visual Studio 2008 Shell(翻译)

如果你现在在创建软件开发工具&#xff0c;你现在可以选择基于Visual Studio 2008 Shell。一个流行的Visual Studio 开发环境&#xff0c;Visual Studio Shell提供了一些核心功能&#xff0c;使你能够创建独一无二的应用程序&#xff0c;弹性的自定义能力帮助你推出更加特别的产…

word删除分节符后之前的格式乱了_办公室高级技能之Word邮件合并拆分

当我们需要批量生成名片&#xff0c;合同&#xff0c;成绩单等有相同内容的文件时&#xff0c;使用word邮件合并功能非常方便。如果你还需要把word文件发给不同的人就需要再拆分一下&#xff0c;用复制粘贴的方法拆分word&#xff0c;数量一多不仅效率低&#xff0c;还会因为文…

程序员面试金典 - 面试题 16.24. 数对和(双指针/哈希map)

文章目录1. 题目2. 解题2.1 排序双指针2.2 哈希map1. 题目 设计一个算法&#xff0c;找出数组中两数之和为指定值的所有整数对。一个数只能属于一个数对。 示例 1: 输入: nums [5,6,5], target 11 输出: [[5,6]]示例 2: 输入: nums [5,6,5,6], target 11 输出: [[5,6],[5…

ICLR 2023 最高分论文被锤抄袭??

文 | 智商掉了一地究竟是Git Clone还是Git Re-Basin&#xff1f;被评论区长文石锤&#xff01;如上图所示&#xff0c;ICLR 2023 官方近期正式宣布评审工作已结束&#xff0c;评分最高的 Git Re-Basin 这项神经网络启发性新研究探索了在深度学习中&#xff0c;SGD算法在高维非凸…

新浪的图片新闻效果

<html><head><title>新浪的图片新闻效果</title><meta http-equiv"Content-Type"content"text/html; charsetgb2312"></head><body bgcolor"#FFFFFF"text"#000000"><p> </p>&l…