给定两个有序数组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. 使用jsx语法环境搭建

    1.安装nodejs.nodejs安装后会自带npm,可以用 npm -v 进行查看版本.使用 npm install npm -g 更新文档. 2.创建自己项目,在你的项目路径下执行npm init ...

  2. CGAffineTransform函数旋转操作

    本文转载至  http://blog.sina.com.cn/s/blog_923fdd9b0101ahyx.html   首先获取UITableView的CGAffineTransform函数:CG ...

  3. Axis-Parallel Rectangle

    D - Axis-Parallel Rectangle Time limit : 2sec / Memory limit : 256MB Score : 400 points Problem Stat ...

  4. jetty 通过配置文件嵌入式启动web服务

    定义 jetty.xml 启动文件 <?xml version="1.0"?><!DOCTYPE Configure PUBLIC "-//Jetty/ ...

  5. linux磁盘清理

    一.背景: 1.由于linux系统空间是由挂载磁盘得来的,但有时装系统时挂载/根目录空间不大,现仅清除用户下载的大文件 二.方法: 1.输入命令df -h显示当前磁盘挂载(包含剩余空间)情况这里写图片 ...

  6. C#窗体传值

    整理一下: 1.静态变量传值,非常简单适合简单的非实例的 public calss form1:Form{ public static int A; } public class form2:Form ...

  7. 剖析与优化 Go 的 web 应用

    https://mp.weixin.qq.com/s/HDsbZLOK3h8-XjejvPH2sA https://studygolang.com/articles/12685

  8. 修改 /var/lib/locales/supported.d/local 文件(使用 locale -a 命令查看系统中所有已配置的 locale)

    转自:http://zyxhome.org/wp/cc-prog-lang/c-stdlib-setlocale-usage-note/ http://www.west263.com/info/htm ...

  9. MySQL版本与工具

    MySQL各个版本区别 MySQL 的官网下载地址:http://www.mysql.com/downloads/ 在这个下载界面会有几个版本的选择. 1. MySQL Community Serve ...

  10. bash常见命令

    pwd (Print Working Directory) 查看当前目录 cd (Change Directory) 切换目录,如 cd /etc ls (List) 查看当前目录下内容,如 ls - ...