给定两个有序数组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<e1){
mid1 = (s1+e1) /2;
mid2 = (s2+e2) /2;
offset = ((e1-s1+1)&1)^1;
if (a1[mid1]>a2[mid2]) {
e1 = mid1;
s2 = mid2+offset;
}else if(a1[mid1]<a2[mid2]){
s1 = mid1 + offset;
e2= mid2;
}else {
return a1[mid1];
} } return Math.min(a1[s1], a2[s2]); } public static int findKthNum(int[] arr1, int[] arr2, int kth){ if(arr1==null || arr2==null){
throw new RuntimeException("are you ok?");
}
if(kth<1 || kth>arr1.length+arr2.length){ throw new RuntimeException("too long"); }
int[] longs = arr1.length >=arr2.length ? arr1 :arr2;
int[] shorts = arr1.length <arr2.length ? arr1 :arr2; int l = longs.length;
int s = shorts.length; if(kth <= s){
return getUpMedian(shorts, 0, kth-1, longs, 0, kth-1);
} if(kth>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); } }

结果:

算法总结之 在两个排序数组中找到第K小的数的更多相关文章

  1. [程序员代码面试指南]第9章-在两个长度相等的排序数组中找到第k小的数(二分)

    题目 给定两个有序数组arr1和arr2,再给定一个整数k,返回所有的数中第k小的数. 题解 利用题目"在两个长度相等的排序数组中找到第上中位数"的函数 分类讨论 k < 1 ...

  2. Coursera Algorithms week3 快速排序 练习测验: Selection in two sorted arrays(从两个有序数组中寻找第K大元素)

    题目原文 Selection in two sorted arrays. Given two sorted arrays a[] and b[], of sizes n1 and n2, respec ...

  3. [转载]寻找两个有序数组中的第K个数或者中位数

    http://blog.csdn.net/realxie/article/details/8078043 假设有长度分为为M和N的两个升序数组A和B,在A和B两个数组中查找第K大的数,即将A和B按升序 ...

  4. 在未排序的数组中找到第 k 个最大的元素

    在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ...

  5. 【一起刷LeetCode】在未排序的数组中找到第 k 个最大的元素

    题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...

  6. 查找两个有序数组中的第K个元素(find kth smallest element in 2 sorted arrays)

    查找两个有序数组中的第K个元素 int FindKth(int a[], int b[], int k, int astart, int aend, int bstart, int bend) { ; ...

  7. 现在有m组n个有序数组,例如{1,2,3,4},{2,3,4,6},{1,3,5,7},在这些数组中选择第k小的数据,然后返回这个值

    问题描述:现在有m组n个有序数组,例如{1,2,3,4},{2,3,4,6},{1,3,5,7},在这些数组中选择第k小的数据,然后返回这个值 思路:参照两个数组归并的过程,每次选取最小的数据进行比较 ...

  8. 选取两个有序数组中最大的K个值,降序存入另一个数组中

    原题: 假设有两个有序的整型数组int *a1, int *a2,长度分别为m和n.试用C语言写出一个函数选取两个数组中最大的K个值(K可能大于m+n)写到int *a3中,保持a3降序,并返回a3实 ...

  9. 记录我对'我们有成熟的时间复杂度为O(n)的算法得到数组中任意第k大的数'的误解

    这篇博客记录我对剑指offer第2版"面试题39:数组中出现次数超过一半的数字"题解1的一句话的一个小误解,以及汇总一下涉及partition算法的相关题目. 在剑指offer第2 ...

随机推荐

  1. iOS开发常见问题(不断更新)

    1.如何从程序退出到桌面 在单击事件中 exit(0);即可. 2.如何强制横屏 在你需要横屏的控制器里加入如下代码 - (BOOL)shouldAutorotate{ return NO; } - ...

  2. redis 底层数据结构 整数集合intset

    整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时Redis就会使用整数集合作为集合键的底层实现 整数集合是Redis用于保存整数值的集合抽象数据结构,它可以保存 ...

  3. 关于spring MVC中加载多个validator的方法。

    首先讲下什么叫做validator: validator是验证器,可以验证后台接受的数据,对数据做校验. SpringMVC服务器验证有两种方式,一种是基于Validator接口,一种是使用Annot ...

  4. windows解除端口占用

    1.步骤如图: 图片原文:https://stackoverflow.com/questions/33108185/intellij-keeps-displaying-annoying-message ...

  5. outlook撤回已发送邮件

    官方教程参考: https://support.office.com/zh-cn/article/%E5%8F%91%E9%80%81%E9%82%AE%E4%BB%B6%E5%90%8E%E6%92 ...

  6. MySQL中常用字符串函数

    1.字符串长度函数CHAR_LENGTH(str),LENGTH(str)  CHAR_LENGTH()返回值为字符串str的长度,长度的单位为字符.一个多字节字符算作一个单字符.对于一个包含五个二字 ...

  7. Magic Cast Method in Java Magic Trick In Java

    https://www.atlassian.com/blog/archives/magic_trick_in_java https://www.gamlor.info/wordpress/2010/1 ...

  8. _utf8_encode _utf8_decode base64_encode base64_decode

    const Base64 = { // private property _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv ...

  9. 删除datatable中的行

    今天遇到一问题,无论如何也删除不干净datatable.我想全部删除.但总是得不到想要的结果. ; i < dt.Rows.Count; i++) { //dt.Rows.Remove(dt.R ...

  10. [转载]使用iscroll.js-tab左右滑动导航--tab点击无效果

     转载自:http://blog.csdn.net/zuoyiran520081/article/details/77369421 最近在页面中用iscroll.js,但是但是有跳转,用a标签的hre ...