问题 G: 第 K 个数是否改变

寻找最大的K个数 此题多数互联网公司都有提及,这里简单描述一下。 首先,被问到这题应该先询问数据规模与数据分布。如果数据规模比较小,在千数量级,采用O(nlgn)排序取前K个即可。如果数据为整形,且分布范围不大,可以考虑计数排序,在线性时间中求解。 其次,如果不是上面讨论的情况,就是大规模一般情况。数据集可能在10亿个整形数中取最大的1W个。10亿个整形数全部装入内存大概需要4G空间。 以下采用两种方法: 1、快排方法,快排采用分治思想,每次把数组分成两部分,所以这里关键就是找到第K大的数的那次划分,前一部分数组就是 阅读详情

【题目描述】

请你对一个数组(每个数字都不同)进行m次对原数组的修改操作和判断操作:每次操作对原数组的 l 到 r 的区间内进行从小到大的排序,并判断原数组第 k 个数是否不变。

【输入描述】

第一行输入两个数 m(数组中有 m 个数字) n(一共 n 次操作)(1 ≤ n, m ≤ 10^4)
第二行 输入数组中的 m 个数字 P1 P2 P3….Pn(1≤Pi≤n)
接下来 n 行,输入三个数字 l r k (1≤ l≤ k ≤r ≤n)
表示操作区间 l r,以及判断原数组的第 k 个数是否不变

【输出描述】

对于每次操作如果原数组第 k 个数如果不变输出“Yes”否则输出“No”

【输入样例】

5 5
5 4 3 2 1
1 5 3
1 3 1
2 4 3
4 4 4
2 5 3

【输出描述】

Yes
No
Yes
Yes
No

【思路及特别提示】

这题我只能说做题时一定要避免惯性思维,它有时候能成事,有时候也能坏事,这题就是,一看到题目就想到部分排序,但是这是错的,这么做就走上了一条不归路。。。怎么说呢还是得多刷题啊!!!
言归正传,其实这题解法很简单,只需要在指定区间内找比原数列第k个数小的元素的个数,看其是不是等于k-1个即可,满足就输出Yes,否则输出No,这就完事了,笨死我了啊啊啊。

【代码】

【超时代码】

这个解法得到的结果是正确的,但是时间超时了。。。采用了常规的sort函数进行排序,按理说sort的效率很高,应对大多数排序都没问题,但是这题显然难就难在卡住了sort,利用我们做题的惯性思维挖坑。

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int m,n,i,j,l,r,k,num[10001];//m数组中元素个数
    cin>>m>>n;
    for(i=1;i<=m;i++)
        cin>>num[i];
    for(i=0;i<n;i++){
        int cpynum[10001];
        for(j=1;j<=m;j++){
            cpynum[j]=num[j];
        }
        cin>>l>>r>>k;
        sort(cpynum+l,cpynum+r+1);
        for(int j=1;j<=m;j++)
            cout<<cpynum[j]<<" ";
        cout<<endl;
        if(num[k]==cpynum[k])
            cout<<"YES";
        else
            cout<<"NO";
        if(i<n-1)
            cout<<endl;
    }
    return 0;
}

【正确代码】

#include <bits/stdc++.h>
#define N 10010
using namespace std;
int main() {
    int n, m;
    int a[N];
    int l, r, x;
    cin>>n>>m;
    for(int i = 1; i <= n; i++)
        cin >> a[i];
    while(m--){
        cin>>l>>r>>x;
        int cnt = 0;
        for (int i = l; i <= r; i++)
            if (a[i] < a[x])
                cnt++;
        if(cnt==(x-l))
            cout << "Yes" << endl;
        else
            cout << "No" << endl;
    }
    return 0;
}
近世代数--陪集--拉格朗日定理|G|=|H|·[G:H],传递性[G:H][H:K]=[G:K] 信息安全数学基础--群环域--拉格朗日定理先验知识定理 博主是初学信息安全数学基础(整除+同余+原根+群环域),本意是想整理一些较难理解的定理、算法,加深记忆也方便日后查找;如果有错,欢迎指正。 先验知识 群G:非空集合+代数运算:单位元+逆元+封闭性+结合性 子群H:H是G的非空子集,对于G的代数运算还是满足:单位元+逆元+封闭性+结合性,记为H≤GH\le GH≤G 陪集:g∈G,Hg\in G,Hg∈G,H是(G,⋅)(G,·)(G,⋅)的子群,集合{g⋅h∣h∈H}\{g·h|h\in H\}{g 阅读详情

相关推荐

海量数据处理:如何从10亿个数中,找出最大的10000个数?(top K问题)

一、问题 有 10 亿个不重复的数字,内存中只能放进 1 万个数,怎么找到最大的 10 万个数字? 这道题的思路是,先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的数(10000中最小的),将这个数替换堆顶,并调整结构使之仍然是一个最小堆,这样,遍历完后,堆中的10000个数就是所需的最大的10000个。 复杂度分析 建堆时间复杂度是O(m),堆调整的时间复杂度是O(logm),最终时间复杂度等于,1次建堆时间+n次堆调整时间=O(m+nlogm)=O(nlogm) 这里的n为10亿,m为100

寒泉 7万+

求一个数组中第k大的数,要求不能另外申请空间,数组顺序不能被改变

这是一道今日头条的面试题,当面试官提出这样一道题目时。我想相信,大多数人都会这样反应 1.是不是可以先排一下序,然后再求第k大的,然后就想到数组顺序不能被改变,然后否定了 2.是不是可以用小堆来做。我创建一个堆大小为k的小堆,然后把这些数据全部扔进小堆中,除了堆顶,其他的数要么就被丢弃了要么就因为大于k而沉入堆底,而最后第k大的 数就是堆顶那个数。然后想到不能申请空间,这个想法也被否定了。

gengdidi的专栏 1414

k-center问题

k-center问题 问题描述

skewary的博客 3134

2020寒假训练第一周 思维+模拟

这周相对来说比较简单都是基础题 同样 枯木逢春不在茂 年少且惜镜边人 直接看题吧!!!!奥利干! 1. 对于给定的一个字符串,统计其中数字字符出现的次数。 Input 输入数据有多行,第一行是一个整数n,表示测试实例的个数,后面跟着n行,每行包括一个由字母和数字组成的字符串。 Output 对于每个测试实例,输出该串中数值的个数,每个输出占一行。 Sam...

WOF_Spark的博客 2752

海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)

海量数据处理 - 10亿个数中找出最大的10000个数(top K问题) 问题:先拿10000个数建最小堆,然后依次添加剩余元素,如果大于堆顶的数(10000中最小的),将这个数替换堆顶,并调整结构使之仍然是一个最小堆,这样,遍历完后,堆中的10000个数就是所需的最大的10000个。建堆时间复杂度是O(mlogm),算法的时间复杂度为O(nmlogm)(n为10亿,m为10000)。 ...

jacke121的专栏 2781

Unity游戏开发客户端面经——网络(初级)

Unity游戏开发客户端面经 之 网络 篇

Sea3752的博客 1万+

给定一个数组,找出其中最小的K个数

学习大神的代码,解决了给定的数组中含两位数及以上的数值则出现不正常的问题,除个别语句可以省略外,还发现了取最小的几个数没有包含整个数组的的问题。解决方法是在“len(inset_list)”后加1。完整代码如下 num_list = list(input(‘请给定一个以“,”隔开的数组:).split(’,’)) target_list = [] k **给定一个数组,找出其中最小的K个数**欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何

weixin_45476626的博客 798

【华为2021校招】笔试题【通用硬件】

时间:2020/07/15 19:00 时长:60min 题型:40单选+5多选 难度:中等 考察范围:模电、数电、SI、EMC、电源、微机原理、计算机网络、材料

Jkcia的博客 4万+

三星nandflash K9K8G08U0D升级K9K8G08U0E问题总结

三星的nandflash原来用的K9K8G08U0D版本,后面升为K9K8G08U0E版本的芯片出现了问题。(使用的系统平台是ucos-II) 测试程序中,是往flash中写0,1,2,3,4,5,6..读出来时非0的数值正常,写0的时候读出来的数据就不对。 时序上用示波器测过没发现问题,重新换上D版本的芯片也完全正常。 对比D版本和E版本的datasheet,两个芯片的最主要区别如下:

Wolf的专栏 6733

别再为淘宝滑块发愁了!一个Python脚本自动获取x5sec cookie的保姆级教程

本文提供了一套完整的Python自动化解决方案,帮助开发者轻松应对淘宝滑块验证码问题。通过模拟浏览器行为、精准识别滑块缺口位置和生成拟人化移动轨迹,脚本能够自动获取关键的x5sec cookie,显著提升爬虫效率。教程涵盖环境配置、验证机制分析、代码实现及反检测策略,是解决淘宝滑块验证的实用指南。

weixin_30300225的博客 577

【VAX 小番茄安装详细步骤】

本文详细介绍了在VS2022环境下安装Visual Assist X(番茄助手)的步骤及常见问题解决方案。主要内容包括:安装前的兼容性设置(需修改为Windows7兼容模式)、安装流程(卸载旧版本、勾选对应VS版本、替换关键dll文件)以及常见问题处理(如安装失败、工具栏图标缺失等)。文章提供了完整的下载链接和操作截图,特别强调了安装失败后的清理方法(注册表、安装目录和残余文件删除)。最后给出了安装成功后的测试运行指引。

qq_23962581的博客 1719

g10k 项目常见问题解决方案

g10k 项目常见问题解决方案 一、项目基础介绍 g10k 是一个用 Go 语言编写的开源项目,它是 r10k 的一个分支。该项目旨在优化 Puppet 环境中的模块管理,提高性能并解决原 r10k 实现中的缓存和版本预检查问题。g10k 支持并行操作,可以更高效地处理多个 Puppetfile 中的模块。 二、新手常见问题及解决方案 问题 1:如何安装 g10k? 解决步骤: 首先,确保你的...

gitblog_00581的博客 272

使用Docker搭建SearXNG搜索引擎

【代码】使用Docker搭建SearXNG搜索引擎。

janthinasnail的博客 1181

堆排序之“TOP-K”问题

堆排序之“TOP-K”问题

Han同学 1737

一篇文章带你快速入门 MATLAB

文章目录一、认识 MATLAB 界面二、MATLAB 的运行方式三、Matlab 中的窗口1. 命令窗口2. MATLAB的程序编辑窗口3. 工作空间窗口4. 命令历史窗口5. 图形窗口6. 当前目录窗口四、MATLAB的帮助系统1. 帮助命令2. 联机帮助五、其他知识补充1. MATLAB的搜索路径2. 变量命名规则3. M文件命名规则 一、认识 MATLAB 界面 在 MATLAB Desktop 中,工具条取代了菜单和工具栏。应用程序库收纳了 MATLAB 产品系列的应用程序,单一文件应用程序打包为一

南淮北安的博客 5128

21、深入了解SELinux安全系统与/proc文件系统

本文深入探讨了SELinux安全系统与/proc文件系统的原理及实际应用。详细介绍了SELinux的安全上下文、域转换、运行模式、角色管理以及策略查看工具seinfo的使用;同时解析了/proc文件系统的结构与功能,涵盖进程信息查看、系统资源监控及性能优化方法。结合SELinux与/proc的协同应用,提供了系统问题排查流程与安全管理最佳实践,帮助用户提升Linux系统的安全性与稳定性。

ik678901234的博客 63

java实现输入n个整数,找出其中最小的K个数

package Nowcode; import java.util.ArrayList; /** * 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。 * * @author Administrator * */ public class GetLeastNumbers { // 解决一:o(n)的算法:只

pomay的博客 6227

【机器人技术基础】MATLAB Robotics Toolbox PUMA560 运动学正逆解

机器人技术基础实验2报告 1. 实验目的和要求 2. 实验手段 2.1 实验原理 2.2 函数详解 3. 实验主要内容 4. 实验结果和分析 4.1 正运动学求解 例1 例2 4.2 逆运动学求解 例1 例2 1. 实验目的和要求 掌握常见形式的机器人的D-H坐标系建立方法、运动学建模; 正逆运动学分析与求解; 使用Robotics Toolbox对直角坐标机器人、圆柱坐标机器人、球坐标机器人、PUMA560其中之一建立运动学模型,正逆求解和仿真。 2. 实验手段 2.1

【人工智障 | 计算鸡视觉 | 机器孩】 1万+

在一亿个数中查找最大的k个数(k << 1,000,000,000)

在一亿个整数中查找最大(小)的k个数(k         之前跟一同事说起互联网公司的面试题,他说一般思路是先排序,然后再处理数据肯定没错。是不是这样的呢?对于这个问题,我们想想如下的几个方法:         1.使用大多数情况下最快的排序方法—快速排序来解决可以吗?思路是将一亿个整数放到一个数组中,然后使用快速排序方法把最大的k个数放到数组的前k个空间里。但是,这个问题没有说(1)要排好

winshining的专栏 3232

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

最小的K个数

题目 输入n个整数,找出其中最小的k个数。 例如 输入4,5,1,6,2,7,3,8 输出1,2,3,4 思路 思路一 排序后取出前k个数。时间复杂度为O(nlgn) 思路二 依然根据快速排序中交换数据的方法,被选取的数字被交换的位置,该位置前面的数都比被选取的小,该位置后面的都比选取的大,所以只要找到第k个位置就好。代码见下。 时间复杂度O(n) 思路三 我们可以先创建一...

weixin_42518668的博客 183

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

最小的k个数

输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。

L的博客 716

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

g6k安装教程

g6k安装教程 g6k(general sieve kernel)是由Martin Abrecht团队开发,用于快速计算SVP、LWE等格上困难问题的集成器。 下载链接:https://github.com/fplll/g6k 要求的安装环境:ubuntu+python2/python3 Step1 clone https://github.com/fplll/g6k Step2 cd g6k Step3 配置依赖环境 (1. 在ubuntu上安装python依赖库) #python3 pip3 inst

Summer Day 3132

寻找最小的K个数

“五分化中项的中项”划分法: 1 将输入数组的N个元素划分为[n/5]组,且至多只有一个组有剩下的n mod5组成。 2 寻找这个[n/5]组中没一组的中位数:首先对每组的元素进行插入排序,排序后选出中位数。 3 对第二步找出的[n/5]个中位数,继续递归找到其中位数x。 4 按中位数的中位数x进行partition划分,然后就是select算法。 可以证明的是该划分可以在最坏情况下保证O(n)的时间复杂度。

承续缘的信仰 4116

序列的第k个数

序列的第k个数 题解 一道打卡题,这里就不再叙述了。 上代码。 源码 #include<cstdio> #include<cmath> #include<cstring> #include<iostream> #include<algorithm> #include<stack> #include<vect...

StaroForgin的博客 292

给定任意非空有向图 G,输出 G 中所有 K 顶点的算法,并返回 K 顶点的个数。

给定任意非空有向图 G,输出 G 中所有 K 顶点的算法,并返回 K 顶点的个数。C语言

m0_56332819的博客 509

C语言:判断无向图 G 中任意两点之 间是否存在一条长度为 k 的简单路径算法

递归结束的条件为首尾顶点相遇且 k==0,此时表面两个顶点之间存在一条长度为 k 的简单路径,返回 1。如果递归结束的条件不成立,则从 vi 的边链表的第一个边界点开始,获取 vi 的邻接点,对 vi 的尚未访问的邻接点递归调用,长度 k-1。如果最后递归结束的条件不成立且无法继续递归下去,并不两点之间不存在长度 k。记访问数组,已经访问的顶点记为 true。该算法每递归调用一次,长度 k-1,假设图 G 采用邻接表存储,设计一个算法,判断无向图 G 中任意两点之。间是否存在一条长度为 k 的简单路径。

零小唬的博客 3801
上一篇: 问题 E: 游西湖
下一篇: POJ1000 A+B Problem
菜菜2022
博客等级 码龄9年 67粉丝 1033原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值