当前位置: 首页 > 编程日记 > 正文

LintCode 249. 统计前面比自己小的数的个数

给定一个整数数组(下标由 0 到 n-1, n 表示数组的规模,取值范围由 0 到10000)。对于数组中的每个 ai 元素,请计算 ai 前的数中比它小的元素的数量。

 注意事项

We suggest you finish problem Segment Tree Build, Segment Tree Query II and Count of Smaller Number first.

样例

对于数组[1,2,7,8,5] ,返回 [0,1,2,3,2]

解题思路:

题目提示我们使用线段树,在这里我写了两种线段树的解法,一种TLE,一种正常通过;个人感觉两种写法需要因地制宜使用:

思路1:每个线段树节点存储的是原始vector的index前后值以及该区间内的相应最大值,在查询时,通过区域以及最大值约束找到所有小于特定值的区间最后求和。

class SegmentTreeNode{	//线段树节点,其中max是当前区域内(left-right)最大值
public:int start,end,max;SegmentTreeNode2 * left;SegmentTreeNode2 * right;SegmentTreeNode2(int x,int y,int max){this->start = x;this->end = y;this->max = max;this->left = this->right = nullptr;}
};class Solution {
public:/*** @param A: an integer array* @return: A list of integers includes the index of the first number and the index of the last number*/vector<int> countOfSmallerNumberII(vector<int> &A) {// write your code hereauto tree = new SegmentTreeNode(0,A.size()-1,INT_MIN);buildTree(A,tree);vector<int> ret;for(int i = 0;i<A.size();++i){ret.push_back(query(tree,0,i,A[i]));}return ret;}int buildTree(vector<int> &A,SegmentTreeNode * root){	//建立线段树,每个节点保存该区域内最大值int start = root->start;int end = root->end;if(start > end) return 0;if(start == end) {root->max = A[start];return A[start];}else{root->left = new SegmentTreeNode(start,(start+end)/2,INT_MIN);root->right = new SegmentTreeNode((start+end)/2+1,end,INT_MIN);int L_max = buildTree(A,root->left);int R_max = buildTree(A,root->right);root->max = L_max>R_max?L_max:R_max;return root->max;};}int query(SegmentTreeNode * root,int start,int end,int q){	//查询特定区域比q小的个数if(root == nullptr) return 0;if(root->start > end || root->end < start) return 0;if(root->start >= start && root->end <= end && root->max<q) return root->end - root->start + 1;return query(root->left,start,end,q)+query(root->right,start,end,q);}
};

这种解法TLE,时间复杂度在vector的size很大时很大,某种程度上来讲效率不及直接暴力法,但当所求数据较为集中时应该能提高一点速度。

思路2:对数据的区间建立线段树,在知道所有数据上界的情况下效率不错,能够正常通过

class SegmentTreeNode{//count表示当前区间所有的数个数
public:int start,end,count;SegmentTreeNode * left;SegmentTreeNode * right;SegmentTreeNode(int x,int y,int count){this->start = x;this->end = y;this->count = count;this->left = this->right = nullptr;}
};class Solution {
public:/*** @param A: an integer array* @return: A list of integers includes the index of the first number and the index of the last number*/vector<int> countOfSmallerNumberII(vector<int> &A) {// write your code herevector<int> res;SegmentTreeNode * root = buildTree(0,10001);for(int i=0; i<A.size(); ++i){res.push_back(query(root,A[i]));insert(root,A[i]);}return res;}SegmentTreeNode* buildTree(int start,int end){  //这种方法需要明确数据上界,然后直接根据数据大小建立线段树,每个节点保存落在当前区间数的个数if(start > end) return nullptr;auto res = new SegmentTreeNode(start,end,0);if(start == end) return res;int mid = (start+end)/2;res->left = buildTree(start,mid);res->right = buildTree(mid+1,end);return res;}int query(SegmentTreeNode * root,int q){   //query函数用来查询当前区域内小于q的数的个数if(root == nullptr) return 0;if(q < root->start) return 0;if(q > root->end) return root->count;return query(root->left,q)+query(root->right,q);}void insert(SegmentTreeNode * root,int val){//将输入数据逐个插入,从上到下逐个更新countif(root == nullptr) return;if(root->start > val || root->end < val) return;if(root->start <= val && root->end >= val) ++root->count;insert(root->left,val);insert(root->right,val);}
}

ps:这道题如果使用lintcode内置的SegmentTreeNode 数据结构中的count好像会出问题,最好定义自己的class

转载于:https://www.cnblogs.com/J1ac/p/8729389.html

相关文章:

springboot过滤器排除掉一些url_理解这9大内置过滤器,才算是精通Shiro

小Hub领读&#xff1a;权限框架一般都是一堆过滤器、拦截器的组合运用&#xff0c;在shiro中&#xff0c;有多少个内置的过滤器你知道吗&#xff1f;在哪些场景用那些过滤器&#xff0c;这篇文章希望你能对shiro有个新的认识&#xff01;别忘了&#xff0c;点个 [在看] 支持一下…

安装APK,启动系统Activity

要同时设置data和type的话只能用函数setDataAndType private void installApk(File file) {Intent intent new Intent("android.intent.action.VIEW");intent.addCategory("android.intent.category.DEFAULT"); // intent.setData(Uri.fromFile(fi…

EOS能不能囤?一篇文章搞懂EOS优缺点

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 EOS是一个基于区块链的开发平台&#xff0c;专为构建去中心化应用程序&#xff08;dApp&#xff09;而设计。EOS是一个开源项目&#xff0c;其源代…

JS 中的事件设计

看懂此文&#xff0c;不再困惑于 JS 中的事件设计 原文出处&#xff1a; aitangyong 抽空学习了下javascript和jquery的事件设计&#xff0c;收获颇大&#xff0c;总结此贴&#xff0c;和大家分享。 (一)事件绑定的几种方式 javascript给DOM绑定事件处理函数总的来说有2种方式…

‘百度杯’十月场web ---login

首先一看的题&#xff0c;既然是是web类的&#xff0c;就要查看源码&#xff0c;一看&#xff0c;最先有一行注释&#xff0c;估摸着是用户名和密码 果然登录上去了&#xff0c;显示一段乱码&#xff0c;源码也没有什么东西&#xff0c; 那就抓一次包吧 发现响应头里边有个sho…

oracle 与 client端执行结果不一致_不同模式下Spark应用的执行过程

根据应用执行的3个阶段&#xff0c;不同执行模式下各个阶段的执行逻辑不相同&#xff0c;本文分析不同模式下的执行逻辑。Yarn-Client模式的执行流程Yarn的组成Yarn是hadoop自带的资源管理框架&#xff0c;它的设计思想是&#xff1a;YARN的基本思想是将资源管理和作业调度/监视…

分享EOS加拿大的文章《REX——从源代码做技术解析》

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 已提议将丢失密钥恢复系统部署到EOS主网。 丢失密钥解决方案的最后一步已经在链上提出。最后一步是将丢失密钥解决方案智能合约部署到为此目的创建…

16.QT鼠标

头文件 1 #include <QMouseEvent> 2 #include <QStatusBar> 3 #include <QLabel> 1 protected: 2 //鼠标按下 3 void mousePressEvent(QMouseEvent *e); 4 //鼠标移动 5 void mouseMoveEvent(QMouseEvent *e); 6 //鼠标释放 7 void …

c++ windows获得当前工作目录文件_基于linux下Python文件操作

Python中的文件操作1、文件的打开与关闭想一想&#xff1a;如果想用word编写一份简历&#xff0c;应该有哪些流程呢&#xff1f;1、打开word软件&#xff0c;新建一个word文件2、写入个人简历信息3、保存文件4、关闭word软件同样&#xff0c;在操作文件的整体过程与使用word编写…

maven 插件

maven-enforcer-plugin https://maven.apache.org/enforcer/maven-enforcer-plugin/ https://maven.apache.org/enforcer/maven-enforcer-plugin/enforce-mojo.html http://maven.apache.org/enforcer/enforcer-rules/index.html转载于:https://www.cnblogs.com/SamuelSun/p/58…

数字货币EOS半年时间暴跌90%多,还可追捧吗?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 对财富上的自由&#xff0c;很多人认为这比感情来得容易多了。但是面对这个竞争激烈的社会&#xff0c;是兢兢业业的工作&#xff0c;还是投资房地产…

resnet keras 结构_Wandb用起来,一行Python代码实现Keras模型可视化

大数据文摘出品来源&#xff1a;wandb编译&#xff1a;邢畅、宁静在训练神经网络的过程中&#xff0c;我们可能会希望可视化网络的性能和中间的结构&#xff0c;很多可视化代码的冗长复杂使得我们望而却步&#xff0c;有没有一行代码就能解决可视化的所有问题呢&#xff1f;通过…

tensorflow学习笔记————分类MNIST数据集

在使用tensorflow分类MNIST数据集中&#xff0c;最容易遇到的问题是下载MNIST样本的问题。 一般是通过使用tensorflow内置的函数进行下载和加载&#xff0c; from tensorflow.examples.tutorials.mnist import input_data mnist input_data.read_data_sets("MNIST_data&q…

Build SSCLI20 under VS2008 full Document (完全手册)

以前build过几次sscli2都成功了&#xff0c;这次换了个新的环境&#xff0c;没想到出了一大堆的问题。折腾了半天&#xff0c;最终搞定&#xff0c;把解决问题的过程和方法都记录下来。 首先说说build的过程中参考过的链接和资源。 首先就是sscli自带的文档&#xff1a;Buildin…

vue 发展历程时间轴动画_PPT时间轴如何做出创意感?海量素材免费分享,网友:收藏...

时间轴页面&#xff0c;是工作型PPT中常见的页面之一。个人述职或者公司介绍PPT中&#xff0c;使用时间轴&#xff0c;能够让观众更加清晰地了解公司的发展历程。但是&#xff0c;很多人在制作时间轴页面时&#xff0c;往往是这样的效果&#xff1a;只有几行字和一根线&#xf…

[CQOI2014]数三角形 组合数 + 容斥 + gcd

推导过程 &#xff1a; 组合数容斥原理gcd 正确做法是暴力的一种优化&#xff0c;ans所有情况 - 平行坐标轴的三点共线 - 斜线三点共线 如果快速求斜线三点共线&#xff1a; 首先要知道一个结论&#xff0c;对于点(a,b) (x,y)连成的线段而言(其中a>x,b>y)&#xff0c; 在…

石子合并[DP-N3]

题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆&#xff0c;并将新的一堆的石子数&#xff0c;记为该次合并的得分。 试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分. 输入输出格式 输入格式&…

智能合约智能么?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 近几年&#xff0c;随着区块链、加密货币概念的发展&#xff0c;智能合约也开始被广泛的接受&#xff0c;然而就像最初的人工智能被过度神化一样&…

Codeforces 504 A (Round #285 div.1 A) Misha and Forest

Codeforces Round #285 (Div.1) A Misha and Forest 水题水题水…… 题意&#xff1a;给你一些点&#xff0c;给出他们连通了多少个点以及这些点的下标的异或值&#xff0c;让你找出一个图 题解&#xff1a;拓扑排序一发 代码: #include <iostream> #include <cstdio&…

hashlib模式和hmac模式

hashlib模式 什么叫hash&#xff1f; 一&#xff1a;hash是一种算法&#xff08;3.x里代替了md5模块和sha模块&#xff0c;主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 &#xff0c;MD5 算法&#xff09;&#xff0c;该算法接受传入的内容&#xff0c;经过运算得到一串hash…

asp导出word中文乱码_解决文档打开乱码问题丨小工具系列

问题:手头上有个从Workbench导出的数据表文档打开发现里面的中文是乱码&#xff01;如图所示&#xff1a;解决方法利用记事本&#xff08;notepad&#xff09;将该文档的格式修改为UTF-8&#xff0c;步骤如下点击电脑的开始菜单&#xff0c;点击"所有程序"&#xff0…

一篇文章让你了解智能合约以及和区块链的关系

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 智能合约是区块链最重要的特性&#xff0c;也是区块链能够被称为颠覆性技术的主要原因&#xff0c;更是各国央行考虑使用区块链技术来发行数字货币的…

我的常用npm命令

npm link gulp node-sass gulp-sass gulp-autoprefixer gulp-sourcemaps gulp-font-spider gulp-concat gulp-uglify gulp-jshint map-stream 转载于:https://www.cnblogs.com/siluo2000/p/8779988.html

pytorch 测试每一类_DeepFM全方面解析(附pytorch源码)

写在前面最近看了DeepFM这个模型。把我学习的思路和总结放上来给大家和未来的自己做个参考和借鉴。文章主要希望能串起学习DeepFM的各个环节&#xff0c;梳理整个学习思路。以“我”的角度浅谈一下DeepFM基础知识看过的一些有用文献最后附上可实现的pytorch代码&#xff0c;用具…

超简单的网页选项卡---jQuery

<!DOCTYPE html><html lang"en"><head> <meta charset"UTF-8"> <title>网页选项卡</title> <script src"jquery-1.4.2.js"></script> <script type"text/javascript"> $(funct…

一篇文章让你了解区块链技术的发展阶段

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 区块链是由一系列技术实现的全新去中心化经济组织模式&#xff0c;2009年诞生于比特币系统的构建&#xff0c;2017年成为全球经济热点&#xff0c;但…

301 Remove Invalid Parentheses 删除无效的括号

删除最小数目的无效括号&#xff0c;使输入的字符串有效&#xff0c;返回所有可能的结果。注意: 输入可能包含了除 ( 和 ) 以外的元素。示例 :"()())()" -> ["()()()", "(())()"]"(a)())()" -> ["(a)()()", "(a(…

python3 列表转字节_Python 3.9!10大新特性值得关注

选自towardsdatascience作者&#xff1a;Farhad Malik机器之心编译编辑&#xff1a;陈萍近日&#xff0c;Python 3.9 发布&#xff0c;并开发了一些新特性&#xff0c;包括字典合并与更新、新的解析器、新的字符串函数等。Python 3.9 已于 10 月 5 日发布&#xff0c;新版本的特…

HDU4080 Stammering Aliens(二分 + 后缀数组)

题目 Source http://acm.hdu.edu.cn/showproblem.php?pid4080 Description Dr. Ellie Arroway has established contact with an extraterrestrial civilization. However, all efforts to decode their messages have failed so far because, as luck would have it, they ha…

共识机制:区块链技术的根基

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 Chapter&#xff0d;1&#xff1a;什么是共识机制&#xff1f; 技术定义是&#xff1a;共识机制是一个群体决策的流程&#xff0c;群体中的个体会执…