给定两个长度为m和n的有序列表,以O(logm+logn)复杂度找出有序列表第k小的数
思路
logm+logn即可推断是分治,每次折半得到两个数组的A[midA]和B[midB],有:
- A[midA]>B[midB]时:
- 若midA+midB(实际上是midA+midB-beginA-beginB+2,下同)的元素个数>k,则midB之后的序列肯定不包含在最终的有序k个元素的数列中。不能包括=k的情况,因为=k时,midB也可能包含在最终的有序k个元素数列中。这里的等于号的逻辑错误看了很久才发现。
- 若midA+midB的元素个数<=(注意是小于等于)k,则midA及之前的元素肯定包含在最终的有序k个元素的数列中 ,k=k-(midA-beginA+1),转换为一个更小的求第k个数的问题。
#include <iostream>
#define M 5
#define N 6
using namespace std;
int INDEX1[M] = { 1,2,4,5,6 };
int INDEX2[N] = { 2,3,5,7,9,10 };
int FindK(int*A, int*B, int beginA, int endA, int beginB, int endB, int k) {
printf("A:%d-->%d B:%d-->%d\n", beginA, endA, beginB, endB);
int midA = (beginA + endA) / 2;
int midB = (beginB +