难了我两个月的海豚浏览器面试题,终于解决了。

这是一篇关于解决数组最小k和问题的博客,博主分享了如何通过类似胜者树的策略,避免使用O(k^2)的复杂度,转而实现O(k*lgk)的时间复杂度和O(k)的空间复杂度。文中详细解释了算法思路,并提供了包含处理重复元素的代码实现,同时提出了寻找最小2k个组合的扩展思考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个题纠结了两个多月,一直没有找到很好的解决方法,现在终于能够找到一种很满意的方法了。

题目:有两个大小都是k的数组A,B,它们元素的按非递减有序排列,找出这样的k个最小的(ai + bj) ,其中 0<= i,j < k,要求算法的时间复杂度和空间复杂度尽量低。

想到的最简单的方法就是开辟一个k*k的二维数组,然后计算所有的(ai + bj), 然后在其中找到最小的k个(ai + bj),但是这样的时间复杂度和空间复杂度都很高O(k^2)。

那么接下来就讲一种最新的方法吧:该方法类似于胜者树或者败者树,就想多路归并排序一样。首先,“臆造”这样一个二维数组,它有k行k列,第(i,j)位置的元素是ai + bj的和。然后定义如下的结构体:

typedef struct node{

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值