题目:
两个升序等长数组num1
和num2
,找出两个数组中所有元素里的第k
小的数,两个数组长度均为n
,且n >= k >= 1
,写出find_kth_number
返回第k
小的数组
思路一:归并优化O(k)
使用归并排序的合并方法:
步骤:
1、两个指针p1
,p2
分别指向num1
和num2
的头
2、若num1[p1] <= num2[p2]
; p1++
;反之,p2++
3、while
循环k - 1
次,跳出循环的p1
和p2
所指数中谁小谁为所求
【注意】 要考虑到超界问题(当p1
或p2
走到空的情况)
int find_kth_number(int *num1, int *num2, int n, int k) {
}
代码演示
int find_kth_number(int *num1, int *num2, int n, int k) {
//双指针
int p1 = 0, p2 = 0;
while (--k) {
//注意判断指针所指是否合法
if (p1 < n && num1[p1] <= num2[p2]) ++p1;
else ++p2;
}
//指针超界操作
if (p1 >= n) return num2[p2];
if (p2 >= n) return num1[p1];
return num1[p1] <= num2[p2] ? num1[p1] : num2[p2];
}