[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,表示此数字的左子树的节点数。我们来看下面这个例子,每个节点表示当前数字,括号中的数字表示当前节点的左子节点的个数。

          20(4)
        /              /              15(3)       25(2)
     /          /
    /          /
   10(1)      23(0)
  /  \          /    \         \
5(0)    13(0)    24(0)

假如我们要找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 = 0;
    RankNode *left;
    RankNode *right;
    int data = 0;
    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 ? -1 : left->getRank(d);
        } else {
            return right == nullptr ? -1 : right->getRank(d) + 1 + 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);
    }
};
时间: 2024-08-06 23:16:01

[CareerCup] 11.8 The Rank of Number 数的排行的相关文章

ZOJ 3622 Magic Number(数)

题意  假设一个正整数y满足  将随意正整数x放到y的左边得到的数z满足 z%y==0  那么这个数就是个Magic Number   给你一个范围  求这个范围内Magic Number的个数 令 l表示y的位数  ly=10^l  那么z=x*ly + y  要z%y==0   easy看出  仅仅需 x*ly%y==0 又由于x是随意的  所以一个Magic Number必须满足 ly%y==0 y<2^31  所以l最大为10 直接枚举l  找到全部符合的y即可了 当 ly%y==0  

Minimum Inversion Number 数状数组

Minimum Inversion Number Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1394 Description The inversion number of a given number sequence a1, a2, ..., an is the number of pairs (ai, aj) that sat

[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 to find an element in the array. You may assume that the array was originally sorted in increasing order. EXAMPLE Input: find 5 in {15, 16, 19, 20, 2

HDU 1394Minimum Inversion Number 数状数组 逆序对数量和

Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 18543    Accepted Submission(s): 11246 Problem Description The inversion number of a given number sequence a1, a2, ..., a

[CareerCup] 18.1 Add Two Numbers 两数相加

18.1 Write a function that adds two numbers. You should not use + or any arithmetic operators. 这道题让我们实现两数相加,但是不能用加号或者其他什么数学运算符号,那么我们只能回归计算机运算的本质,位操作Bit Manipulation,我们在做加法运算的时候,每位相加之后可能会有进位Carry产生,然后在下一位计算时需要加上进位一起运算,那么我们能不能将两部分拆开呢,我们来看一个例子759+674 1.

[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 B. Write a method to merge B into A in sorted orde. LeetCode上的原题,请参见我之前的博客Merge Sorted Array 混合插入有序数组. class Solution { public: void merge(vector<int>

[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. 这道题说给了我们一个20GB大小的文件,每行有一个字符串,让我们给文件内容排序.那么既然强调了这么大的一个文件,肯定不想让我们直接进入内存中,那么我们可以把大文件分块,每块xMB,其中x的大小为我们可用的内存大小,我们对每块分别排序,然后把所有的有序块进行合并,这样我们就能得到一个有序的文件了.

CareerCup All in One 题目汇总

Chapter 1. Arrays and Strings 1.1 Unique Characters of a String 1.2 Reverse String 1.3 Permutation String 1.4 Replace Spaces 1.5 Compress String 1.6 Rotate Image 1.7 Set Matrix Zeroes 1.8 String Rotation Chapter 2. Linked Lists 2.1 Remove Duplicates

转载【趣味算术】能被2、3、5、7、9、11、13整除的数的特点

原文地址  http://blog.sina.com.cn/s/blog_76b0cde40100t32r.html 被2整除的数是偶数. 被3整除的数必须各个位数上的数加起来为三的倍数,比如136,1+3+6=10不行,147=1+4+7=12,就可以. 被5整除个位为0或者5. 能被7整除的数的特征  一个数割去末位数字,再从留下来的数中减去所割去数字的2倍,这样,一次次减下去,如果最后的结果是7的倍数(包括0),那么,原来的这个数就一定能被7整除.   这种方法叫“割减法”.此法还可简化为