取数组/序列之和k最小

本文探讨了两种高效的算法来解决数组或序列之和的前k小元素问题。第一种情况涉及两个整数数组的任意两数之和,通过转化为有序数列来找出前k个最小和。第二种情况是两个已排序序列A和B,通过维护下标i和j来求解k个最小的ai+bj。文章还提到了在调试过程中应注意的内存管理和时间复杂度分析。
摘要由CSDN通过智能技术生成

题目1:谷歌面试题——输入是两个整数数组,他们任意两个数的和又可以组成一个数组,求这个和中前k个数怎么取?
分析:
“假设两个整数数组为A和B,各有N个元素,任意两个数的和组成的数组C有N^2个元素。
那么可以把这些和看成N个有序数列:
A[1]+B[1] <= A[1]+B[2] <= A[1]+B[3] <=…
A[2]+B[1] <= A[2]+B[2] <= A[2]+B[3] <=…

A[N]+B[1] <= A[N]+B[2] <= A[N]+B[3] <=…
问题转变成,在这N^2个有序数列里,找到前k小的元素”
题目2:有两个序列A和B,A=(a1,a2,...,ak),B=(b1,b2,...,bk),A和B都按升序排列。对于1<=i,j<=k,求k个最小的(ai+bj)。要求算法尽量高效。
分析:
设定两个下标i,j分别指向A,B的尾部,根据A[i],B[j]两个元素的大小分别移动相应的下标,直到(i-1)j<k或(j-1)i<k,此时剩下的组合数为i*j,遍历数组求得前k个最小和,返回给用户。
参考代码:

#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值