248-统计比给定整数小的数的个数

给定一个整数数组 (下标由 0 到 n-1,其中 n 表示数组的规模,数值范围由 0 到 10000),以及一个 查询列表。对于每一个查询,将会给你一个整数,请你返回该数组中小于给定整数的元素的数量。

注意事项

在做此题前,最好先完成 线段树的构造 and 线段树查询 II 这两道题目。

样例

对于数组 [1,2,7,8,5] ,查询 [1,8,5],返回 [0,4,2]

挑战

否用一下三种方法完成以上题目。

  • 仅用循环方法
  • 分类搜索 和 二进制搜索
  • 构建 线段树 和 搜索

标签

LintCode 版权所有 二分法 线段树

方法一(循环 + 二分查找)

首先对 A 排序,然后以 queries 的每个元素为 target ,用二分查找寻找 target 在 A 的下标,下标值即 A 中小于给定 target 的元素的数量

code

  1. class Solution {
  2. public:
  3. /*
  4. * @param A: An integer array
  5. * @param queries: The query list
  6. * @return: The number of element in the array that are smaller that the given integer
  7. */
  8. vector<int> countOfSmallerNumber(vector<int> A, vector<int> queries) {
  9. // write your code here
  10. int sizeA = A.size(), sizeQ = queries.size();
  11. if (sizeA <= 0 && sizeQ > 0) {
  12. return vector<int>(sizeQ, 0);
  13. }
  14. if (sizeA <= 0 && sizeQ <= 0) {
  15. return vector<int>();
  16. }
  17. vector<int> result;
  18. sort(A.begin(), A.end());
  19. for (int target : queries) {
  20. int count = lower_bound(A.begin(), A.end(), target) - A.begin();
  21. result.push_back(count);
  22. }
  23. return result;
  24. }
  25. };

方法二(线段树)

使用线段树,代码结果是 MLE(超出内存),不过还是简单介绍一下

使用线段树,线段树的额外属性 count 为 A 中 start 到 end 中小于 target 的元素个数,之后以 queries 的每个元素为 target,分别建立线段树

线段树自底而上构建,参考lintcode-439-线段树的构造 II

code

  1. /**
  2. * Definition of SegmentTreeNode:
  3. */
  4. class mySegmentTreeNode {
  5. public:
  6. int start, end, count;
  7. mySegmentTreeNode *left, *right;
  8. mySegmentTreeNode(int start, int end, int max) {
  9. this->start = start;
  10. this->end = end;
  11. this->count = count;
  12. this->left = this->right = NULL;
  13. }
  14. };
  15. class Solution {
  16. public:
  17. /*
  18. * @param A: An integer array
  19. * @param queries: The query list
  20. * @return: The number of element in the array that are smaller that the given integer
  21. */
  22. vector<int> countOfSmallerNumber(vector<int> A, vector<int> queries) {
  23. // write your code here
  24. int sizeA = A.size(), sizeQ = queries.size();
  25. if (sizeA <= 0 && sizeQ > 0) {
  26. return vector<int>(sizeQ, 0);
  27. }
  28. if (sizeA <= 0 && sizeQ <= 0) {
  29. return vector<int>();
  30. }
  31. vector<int> result;
  32. for (int target : queries) {
  33. mySegmentTreeNode *root = build(0, sizeA - 1, A, target);
  34. result.push_back(root->count);
  35. }
  36. return result;
  37. }
  38. mySegmentTreeNode * build(int start, int end, vector<int> &nums, int target) {
  39. // write your code here
  40. if (start > end) {
  41. return nullptr;
  42. }
  43. mySegmentTreeNode *root = new mySegmentTreeNode(start, end, 0);
  44. if (start != end) {
  45. root->left = build(start, (start + end) / 2, nums, target);
  46. root->right = build((start + end) / 2 + 1, end, nums, target);
  47. root->count = root->left->count + root->right->count;
  48. delete root->left; // 减小内存占用
  49. delete root->right;
  50. }
  51. else {
  52. if (target > nums[start]) {
  53. root->count = 1;
  54. }
  55. else {
  56. root->count = 0;
  57. }
  58. }
  59. return root;
  60. }
  61. };

lintcode-248-统计比给定整数小的数的个数的更多相关文章

  1. lintcode - 统计比给定整数小的数的个数(两种方法)

    class Solution { public: /* * @param A: An integer array * @param queries: The query list * @return: ...

  2. Lintcode---统计比给定整数小的数的个数

    给定一个整数数组 (下标由 0 到 n-1,其中 n 表示数组的规模,数值范围由 0 到 10000),以及一个 查询列表.对于每一个查询,将会给你一个整数,请你返回该数组中小于给定整数的元素的数量. ...

  3. 求序列A中每个数的左边比它小的数的个数(树状数组)

    给定一个有N个正整数的序列A(N<=10^5,A[i]<=10^5),对序列中的每一个数,求出序列中它左边比它小的数的个数. 思路:树状数组的经典应用(裸题) #include <i ...

  4. hdu 2838 Cow Sorting 树状数组求所有比x小的数的个数

    Cow Sorting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. 算法笔记求序列A每个元素左边比它小的数的个数(树状数组和离散化)

    #include <iostream> #include <algorithm> #include <cstring> using namespace std ; ...

  6. UPC 2224 Boring Counting (离线线段树,统计区间[l,r]之间大小在[A,B]中的数的个数)

    题目链接:http://acm.upc.edu.cn/problem.php?id=2224 题意:给出n个数pi,和m个查询,每个查询给出l,r,a,b,让你求在区间l~r之间的pi的个数(A< ...

  7. hdu 4417 区间内比h小的数 线段树

    题意求区间内比h小的数的个数 将所有的询问离线读入之后,按H从小到大排序.然后对于所有的结点也按从小到大排序,然后根据查询的H,将比H小的点加入到线段树,然后就是一个区间和. 2015-07-27:专 ...

  8. Python实现在给定整数序列中找到和为100的所有数字组合

    摘要:  使用Python在给定整数序列中找到和为100的所有数字组合.可以学习贪婪算法及递归技巧. 难度:  初级 问题 给定一个整数序列,要求将这些整数的和尽可能拼成 100. 比如 [17, 1 ...

  9. 课堂练习:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。

    题目 1 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 2 要求: (1) 写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数.例如 f(12)  ...

随机推荐

  1. string 模块

    string 说明:string 模块保留了很多有用的常量和类,用来处理 string 和 unicode 对象. 作用:包含处理文本的常量和类. capwords( ) capwords( ) 的作 ...

  2. 解决GetTickCount的问题

    GetTickCount是一个api,它是反应到从开机到当前的毫秒数,这个很好.可以做一些短途的计时器. 比如说做服务器中对象池计时器,对象超过多少时间就自动释放对象. 但是GetTickCount也 ...

  3. md5.digest()与md5.hexdigest()之间的区别及转换

    举给例子 md5 = hashlib.md5('adsf') md5.digest() //返回: '\x05\xc1*(s48l\x94\x13\x1a\xb8\xaa\x00\xd0\x8a' # ...

  4. 用GO写一个区块链

    总结下最近用GO实现区块链实现下面的模块 基本原型 工作量证明,这里用的POW 持久化和命令行,这里用的BoltDB存储区块 地址,这里用的比特币的地址方案 交易 P2P网络,这里为方便本地调试,采用 ...

  5. Mac os安装golang开发环境

    为了能够愉快地进行golang编程,我们需要安装以下几样东西: 包管理Homebrew 语言环境golang 版本管理git 虚拟器docker 编译器Goland 我将按照这个顺序叙述整个安装过程 ...

  6. 20155211 实验三 敏捷开发与XP实践

    20155211 实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验要求 完成实验.撰写实验报告,实验报告以博客方式发表在博客园. 实验步骤 (一)敏捷开发与XP 敏捷开发( ...

  7. 20155211 2016-2017-2 《Java程序设计》第四周学习总结

    20155211 2016-2017-2 <Java程序设计>第四周学习总结 教材学习内容总结 这周的内容感觉较上周相比难度增加 教材学习中的问题和解决过程 刚开始学习第六章的时候的时候敲 ...

  8. Tp框架之命名空间

    命名空间,相当于虚拟目录 实现自动加载类的机制 初始命名空间:Library文件夹 初始命名空间下面有很多根命名空间: 1.Library里面的文件夹 2.APP的模块文件夹 在tp框架中,只有这两个 ...

  9. javaweb(三十四)——使用JDBC处理MySQL大数据

    一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时 ...

  10. 小计Tomcat的调优思路

    描述 最近在补充自己的短板,刚好整理到Tomcat调优这块,基本上面试必问,于是就花了点时间去搜集一下tomcat调优 都调了些什么,先记录一下调优手段,更多详细的原理和实现以后用到时候再来补充记录, ...