首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

第 K 个数问题

道经典题目。给堆乱序数,如果它们从小到大排好,第 k 个是多少。假设排列下标从 1 开始,而非 0 开始。 这个问题如此之简单而熟悉,可它却可以是很多现实问题个子问题抽象。...它本身相关问题其实就不少,而且还可以不断演进,成为不同复杂程度问题。 关于这个问题分析和演进,我们不妨从右两条分支——堆排序或者快排,来分别进行。...如果这堆数很多,但是 k 很小,那使用堆为了取第 k 个数,却需要维护个巨大堆,多少显得浪费。于是引出了下面这个问题: 能够改进上面堆排序做法,仅仅维护个大小为 k 堆吗?...这样问题还是可以基于堆来解决,当然,首先要给每个数组各自排序。思路是类似的。 继续,如果这些数在不同机器上(文件里)呢? 我想这也是个经典问题,这个问题都问烂了。...即便要想把这 k 个数放到台机器上去找也不可行。 【分支:快排】这时候问题就有点复杂了,也有不同处理方法。

40120
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    个数最大k个数(java)

    问题描述:个数最大k个数,如,{1,5,8,9,11,2,3}最大三个数应该是,8,9,11 问题分析:     1.解法:最直观做法是将数组从大到小排序,然后选出其中最大K个数,但是这样解法...2.解法二:不对前K个数进行排序,回忆快排算法中,那个partition函数,就是随机选择数组中个数,把比这个数数,放在数组前面,把比这个数数放在数组 后面,这时想如果找出随机数,最终位置就是...K,那么最大K个数就找出来了,沿着这个思路思考问题,但是这个函数,最后索引位置并不定是K,可能比K大也可能比K小,我们把找出数组分成两部分sa,sb,sa是大部分,sb是小部分,如果sa长度等于...K中元素部分,再从sb中找到,k-m个最大元素,组合起来就是最终结果,那么这时把问题简化成从sb中找k-m个最大元素,所以总体来说这是个递归过程,虽然复杂大也是O(n*logn)但是,每次数据量都会减少所以会更加快...3.解法三:是利用堆排序,建立个K阶最大堆,然后数据个个插入队当中,那么插入队时间复杂度是O(logK),适合数据量比较大时候,用堆效果更加好。

    84220

    面试官:来写个代码下两个数最大公约数

    最近去面试了,面了几家公司,深刻认识到个道理,越是基础问题越重要,越能考察个人技术功底与逻辑思维。比如我们接下来要说个数最大公约数问题。...这类简单算法题目般会出现在面试环节,面试官要求你当场手撕那种。 言归正传,首先我们要知道面试官出个数最大公约数这个题目的目的是什么。知己知彼,才能百战不殆嘛。...这个问题首先考察是候选人数学功底,就是看你知不知道约数算法,比如辗转相除法、更相减损法等;其次就是考察你代码能力了,看你能不能把算法用代码写出来,写代码有没有bug,注没注意边界处理等等...下面我们分别来看下,不同候选人会有什么样表现。 第种,数学功底不扎实,不知道目前已有的约数方法,那估计只能写出下面这种代码了。...第二种,知道约数算法,但是无法用代码实现,这种属于代码功力不够,估计只能回家等通知了。 第三种,知道约数算法,并且能写出代码

    32900

    C语言:个数最大公约数和最小公倍数

    大家好,又见面了,我是你们朋友全栈君。...C语言:个数最大公约数和最小公倍数 个数最大公约数:“辗转相除法”: 设两数为a和b(a>b),用a除以b,得a÷b=商…余数,若余数为0 ,则最大公约数为b;若余数不为0 ,则再用b÷余数..., 得b÷余数=商1…余数1,若余数1=0,则最大公约数为余数,若余数1不为0,继续让商÷余数n,直到能够余数为零 这时除数即最大公约数。...个数最小公倍数: 最小公倍数=两数乘积÷最大公约数 #include #define MAX(a,b) (a>b)?a:b #define MIN(a,b) (a<b)?...= 0) { yu = a%b; a = b; b = yu; } printf("最大公约数为:%d\n", b); printf("最小公倍数为:%d",m*n/b)

    56720

    快速计算约数个数——从基础到高级

    下面我们来看下,针对计算约数个数问题,用不同算法解决,逐步求得最优解 方法 1 最简单,更是非常容易理解方法 复杂度: 主要思想:定义变量,使其在小于传入判断值条件下从 1 开始自增,...如果判断值和该变量进行模取运算后值为 0,则说明该变量此时值是判断值得约数。...循环结束后,输出计数器保存值即为判断值约数个数 这种方法优点除易于理解外,怕是没有优点了。缺点当然就是时间复杂度太高,个值就需要去从 1 直判断到该值。...count++; //计数器自增 } i++; //继续判断下个数字是否为 i 约数 } return count; } 方法 2 复杂度:...进入 for() 循环后,如果 n % i == 0 ,那么说明此时 i 值是 n 约数 大家在这里要注意是 if...else 语句内容,这里主要解释下此处和方法差别 举个例子,如果 n

    76410

    Python|1到n阶乘之和

    问题描述 “从键盘输入n,1+2!+3!+...+n!和” 对于此题,我们可以用定义个函数来解决,接着用个for循环语句来设置从1到n,接下来起来编写这个代码吧。...f *= i return f n = int(input(“请输入正整数:”)) print(“和为:%d“ % sum(map(f,range(1,n+1)))) 若输入正整数3,我们来运行下...图3.1 运行流程 注:要注意return使用,不能忽略 结语 在此代码中,我们需要知道for循环语句使用以及定义def函数,注意我们要求是1到n,按照左闭右开规则,需要填写是n+1,在函数后要记得写上...最后将打印出来会是个整数所以需要用%d。编写时注意符号使用,不能漏用。在写此类题时,只需关注常见代码注意事项再稍加细心即可。 END

    3.2K20

    C语言——个数最大公约数和最小公倍数

    大家好,又见面了,我是你们朋友全栈君。 个数最大公约数常用方法: ※“辗转相除法”,又名欧几里得算法。...= 0){ t = a%b; a = b; b = t; } printf("最大公约数为:%d\n", b); return 0; } 首先,从键盘键入两个数a和b值,变量t来保存余数...用while循环来判断能否整除,根据“辗转相除法”,先用第个数a÷b再将除数b赋给a,余数赋给b,循环往复,直到能整除时结束循环,此时除数b即为最大公约数。...我们发现通过次循环交换了a、b值,这时就能满足a>b条件了,在继续根据辗转相除方法即可得到最大公约数。)...※拓展:个数最小公倍数 关于最小公倍数与最大公约数,有这样定理:最小公倍数×最大公约数=两数乘积。

    40310

    Python|个数最少加数

    问题描述 给定个正整数N,将其表示为数字1,2,5,11相加形式输出。要求上述数字出现总次数最少(每个数字可以重复使用) 样式要求: 输入说明:个正整数N (N<= 10000)。....输出说明:正整数N由1,2,5,11组成加法表达式,要求非递增排列。...输入样例: 21 输出样例: 21=11+5+5 解决方案 要使数字总数最少,就应该从最大数开始 用整除确定该加数数量 用同样方法确定其他加数数量 应为格式要求是[]=[]+[]+[]…所以只能由字符串来实现也就是字符串拼接...因位最后位没有加号所以只输出到倒数第二位就是所要求了 Python代码: N=int(input()) a=N//11 b=(N-a*11)//5 c=(N-a*11-b*5)//2 d=

    79410
    领券