【练习题】求第k小数(有序双数组)

题目:

两个升序等长数组num1num2,找出两个数组中所有元素里的第小的数,两个数组长度均为n,且n >= k >= 1,写出find_kth_number返回第k小的数组

思路一:归并优化O(k)

使用归并排序的合并方法:
步骤
1、两个指针p1,p2分别指向num1num2的头
2、若num1[p1] <= num2[p2]; p1++;反之,p2++
3、while循环k - 1次,跳出循环的p1p2所指数中谁小谁为所求

【注意】 要考虑到超界问题(当p1p2走到空的情况)

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];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值