[CareerCup] 11.8 The Rank of Number 数的排行
11.8 Imagine you are reading in a stream of integers. Periodically, you wish to be able to look up the rank of a number x (the number of values less than or equal tox). Implement the data structures and algorithms to support these operations.That is, implement the method track(int x), which is called when each number is generated, and the method getRankOfNumber(int x), which returns the number of values less than or equal to x (not including x itself).
EXAMPLE
Stream (in order of appearance): 5, 1, 4, 4, 5, 9, 7, 13, 3
getRankOfNumber(l) = 0
getRankOfNumber(3) = 1
getRankOfNumber(4) = 3
这道题给了我们一个无序数组,让我们求每个数字的排行,排行为几就表示有几个小于或等于该数字的数。我们首先需要用一个数据结构来保存有序数组,用向量的话加数字不高效,用priority_queue或者multiset的话求rank又太麻烦,引文不能直接通过坐标访问元素。那么我们考虑用另一种有序的数据结构,二叉搜索树Binary Search Tree,我们知道BST的性质是左<=中<右,中序遍历一个BST的结果就是有序数组。为了更有效的找出rank,我们在加入新数字的时候,记录一个变量left_size,表示此数字的左子树的节点数。我们来看下面这个例子,每个节点表示当前数字,括号中的数字表示当前节点的左子节点的个数。
()
/ \
/ \
() ()
/ /
/ /
() ()
/ \ \
/ \ \
() () ()
假如我们要找24的rank,我们将24与根节点20相比较,发现24应该在根节点的右边,根节点的左子树有四个节点,加上根节点本身,我们现已知有5个小于24的数,将counter设为5,然后我们再跟25比,发现24在其左侧,不更新counter,然后和23比,24在其右侧,counter加1,因为23没有左子树,最后我们就可知24的rank为6, 参见代码如下:
class RankNode {
public:
int left_size = ;
RankNode *left;
RankNode *right;
int data = ;
RankNode(int d): data(d), left(nullptr), right(nullptr) {}
void insert(int d) {
if (d <= data) {
if (left != nullptr) left->insert(d);
else left = new RankNode(d);
++left_size;
} else {
if (right != nullptr) right->insert(d);
else right = new RankNode(d);
}
}
int getRank(int d) {
if (d == data) return left_size;
else if (d < data) {
return left == nullptr ? - : left->getRank(d);
} else {
return right == nullptr ? - : right->getRank(d) + + left_size;
}
}
};
class Solution {
public:
RankNode *root;
void track(int number) {
if (root == nullptr) {
root = new RankNode(number);
} else {
root->insert(number);
}
}
int getRankOfNumber(int number) {
return root->getRank(number);
}
};
[CareerCup] 11.8 The Rank of Number 数的排行的更多相关文章
- [CareerCup] 18.1 Add Two Numbers 两数相加
18.1 Write a function that adds two numbers. You should not use + or any arithmetic operators. 这道题让我 ...
- HDU 1394Minimum Inversion Number 数状数组 逆序对数量和
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- [CareerCup] 11.3 Search in Rotated Sorted Array 在旋转有序矩阵中搜索
11.3 Given a sorted array of n integers that has been rotated an unknown number of times, write code ...
- [CareerCup] 11.7 Tower of People in Circus 马戏团的人塔
11.7 A circus is designing a tower routine consisting of people standing atop one another's shoulder ...
- ZOJ 3622 Magic Number(数)
题意 假设一个正整数y满足 将随意正整数x放到y的左边得到的数z满足 z%y==0 那么这个数就是个Magic Number 给你一个范围 求这个范围内Magic Number的个数 令 ...
- 寻找并输出11~999之间的回文数m
寻找并输出11~999之间的数m,它满足m.m2和m3均为回文数. 回文:各位数字左右对称的整数. 例如:11满足上述条件 112=121,113=1331 判断一个数是否是回文数的方法:求该数的反序 ...
- [CareerCup] 11.1 Merge Arrays 合并数组
11.1 You are given two sorted arrays, A and B, where A has a large enough buffer at the end to hold ...
- [CareerCup] 11.2 Sort Anagrams Array 异位词数组排序
11.2 Write a method to sort an array of strings so that all the anagrams are next to each other. 这道题 ...
- [CareerCup] 11.4 Sort the File 文件排序
11.4 Imagine you have a 20 GB file with one string per line. Explain how you would sort the file. 这道 ...
随机推荐
- Objective-C中常用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect
本节要点:红色标记 需要记下来 1 NSRange typedef struct _NSRange { NSUInteger location; NSUInteger length ...
- spring 管理 jdbc 事务
@Transactional 业务实现类 类名上方--这个类中的方法,执行操作前会打开事务. 默认:RuntimeException 自动回滚, 可以try catch 的异常,不会滚 方法名 ...
- tomcat下部署润乾报表
因为项目需要,需要在项目中配置润乾报表,之前一直是用的jboss服务器,此处调整为tomcat时出错,然后各种找错,找答案,最后终于好了,然后总结一下. 首先在apache-tomcat-6.0.43 ...
- cxf开发Restful Web Services
一.restful web services rest全称是Representation State Transfer(表述性状态转移).它是一种软件架构风格,只是提供了一组设计原则和约束条件.在re ...
- Aptana studio 3前端开发编辑器推荐
直接进入主题,先上图 这就是我Apatana studio 3的默认界面,推荐此工具的原因主要有以下几点: 1.可以集成Emmet,快速编写HTML+CSS,做到效率倍增. 2.Jquery 自动完成 ...
- C语言关键字详解
相对于其他语言来说,C语言的关键字算是少的了.在C98中关键子总共只有32个,我们来分析一下每个关键字在C语言中它独特的作用. 1.关于数据类型的关键字 (1) char :声明字符型变量或函数 ( ...
- mac下 ssh免密码登陆设置
由于mac os 是基于unix的操作系统终端和linux非常类似,所以不用借助类似于windows下的putty 和CRT工具即可远程登陆linux服务器,只需简单地3步即可免密码ssh远程. 1 ...
- SSIS with vertica
使用ODBC进行连接,因为SSIS中没有直接的ODBC connection,所以使用ADO.NET的连接器. 九分钟才跑了四百来条数据. 这个图反应了SSIS的数据流速度还是可以的,但是瓶颈就在OD ...
- [转]Oracle分页之二:自定义web分页控件的封装
本文转自:http://www.cnblogs.com/scy251147/archive/2011/04/16/2018326.html 上节中,讲述的就是Oracle存储过程分页的使用方式,但是如 ...
- 用pygame学习初级python(一) 15.4.19
最近有计划要学一下python,主要是要用flask.django一些框架进行后端的学习工作,但是在web应用之前希望进行一些基础的项目进行一些语法的练习,熟悉一下写法, 这个时候我就想先做几个小游戏 ...