博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法总结之 在两个排序数组中找到第K小的数
阅读量:4496 次
发布时间:2019-06-08

本文共 1616 字,大约阅读时间需要 5 分钟。

给定两个有序数组arr1 和 arr2 ,再给定一个int K,返回所有的数中第K小的数

要求长度如果分别为 N M,时间复杂度O(log(min{M,N}),额外空间复杂度O(1)

 

解决此题的方法跟之前的求两个数组求中位数的情况,如出一辙~ 非常给力!

 此题目需要分情况讨论: 

    假设长度较短的数组长度 lenS   较长的lenL

    情况1、 K<1  或者 K>lenS+lenL    k值无效

    情况2、 k<=lenS  分别在两数组选择第前 k个数, 然后取其中位数

    情况3、 k>lenL  

package TT;public class Test13 {  public static int getUpMedian(int[] a1, int s1, int e1,int[] a2, int s2, int e2){         int mid1 = 0;         int mid2 =0;         int offset = 0;         while(s1
a2[mid2]) { e1 = mid1; s2 = mid2+offset; }else if(a1[mid1]
arr1.length+arr2.length){ throw new RuntimeException("too long"); } int[] longs = arr1.length >=arr2.length ? arr1 :arr2; int[] shorts = arr1.length
l){ if(shorts[kth-l-1]>=longs[l-1]){ return shorts[kth-l-1]; } if(longs[kth-s-1]>=shorts[s-1]){ return longs[kth-s-1]; } return getUpMedian(shorts, kth-l, s-1, longs, kth-s, l-1); } if (longs[kth-s-1]>=shorts[s-1]) { return longs[kth -s -1]; } return getUpMedian(shorts, 0, s-1, longs, kth-s, kth-1); } public static void main(String[] args ){ int[] a1 = new int[4]; int[] a2 = new int[4]; a1[0]=0; a1[1]=1; a1[2]=2; a1[3]=3; a2[0]=4; a2[1]=5; a2[2]=5; a2[3]=6; int kth=4; int c = findKthNum( a1, a2, kth); System.out.println(c); } }

结果:

 

转载于:https://www.cnblogs.com/toov5/p/7418739.html

你可能感兴趣的文章
《自己动手写docker》之namespace部门实验
查看>>
Vim学习总结
查看>>
maven也是Apache开发的,也是java开发的。maven需要你本地系统JDK的支持
查看>>
垂直同步v-sync
查看>>
const关键字祥解
查看>>
JDK提供的并发工具类
查看>>
jmx
查看>>
【JZOJ4161】于神之怒 莫比乌斯反演
查看>>
实践作业4:Web测试实践(小组作业)每日任务记录2
查看>>
kubernetes 之一些报错
查看>>
PHP isset()、empty()、is_null()的使用区别详解
查看>>
软件产品案例分析(团队)
查看>>
eclipse中svn插件的安装
查看>>
北京赛区总结
查看>>
Mysql安装后的一些设置
查看>>
4、Qt Project之串口数据传输
查看>>
Python List reverse()方法
查看>>
Jmeter 正则提取器
查看>>
lua -- 生成协议
查看>>
HLP帮助文件源文件RTF文件的编写
查看>>