这个题纠结了两个多月,一直没有找到很好的解决方法,现在终于能够找到一种很满意的方法了。
题目:有两个大小都是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{

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

被折叠的 条评论
为什么被折叠?



