算法总结之 在两个排序数组中找到第K小的数
给定两个有序数组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小的数的更多相关文章
- [程序员代码面试指南]第9章-在两个长度相等的排序数组中找到第k小的数(二分)
题目 给定两个有序数组arr1和arr2,再给定一个整数k,返回所有的数中第k小的数. 题解 利用题目"在两个长度相等的排序数组中找到第上中位数"的函数 分类讨论 k < 1 ...
- 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 ...
- [转载]寻找两个有序数组中的第K个数或者中位数
http://blog.csdn.net/realxie/article/details/8078043 假设有长度分为为M和N的两个升序数组A和B,在A和B两个数组中查找第K大的数,即将A和B按升序 ...
- 在未排序的数组中找到第 k 个最大的元素
在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ...
- 【一起刷LeetCode】在未排序的数组中找到第 k 个最大的元素
题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...
- 查找两个有序数组中的第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) { ; ...
- 现在有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小的数据,然后返回这个值 思路:参照两个数组归并的过程,每次选取最小的数据进行比较 ...
- 选取两个有序数组中最大的K个值,降序存入另一个数组中
原题: 假设有两个有序的整型数组int *a1, int *a2,长度分别为m和n.试用C语言写出一个函数选取两个数组中最大的K个值(K可能大于m+n)写到int *a3中,保持a3降序,并返回a3实 ...
- 记录我对'我们有成熟的时间复杂度为O(n)的算法得到数组中任意第k大的数'的误解
这篇博客记录我对剑指offer第2版"面试题39:数组中出现次数超过一半的数字"题解1的一句话的一个小误解,以及汇总一下涉及partition算法的相关题目. 在剑指offer第2 ...
随机推荐
- ios 蓝牙相关
ios蓝牙开发项目实战 -(附小米手环实例) 前言 最近一直在开发关于蓝牙的功能,本来是不想写这一篇文章,因为网上关于ios蓝牙开发的文章实在太多了,成吨成吨的文章出现,但是很遗憾都只是一些皮 ...
- Mysql InnoDB表结构
索引组织表 在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table).在InnoDB存储引擎表中,每张表都有个主键(Prim ...
- redis string底层数据结构sds
redis的string没有采用c语言的字符串数组而采用自定义的数据结构SDS(simple dynamic string)设计 len 为字符串的实际长度 在redis中获取字符串的key长度的时 ...
- ios中的coredata
本文转载至 http://blog.csdn.net/chen505358119/article/details/9334831 分类: ios2013-07-15 18:12 12449人阅读 评论 ...
- 信息属性列表关键字 info.plist
本文转载至 http://blog.csdn.net/zaitianaoxiang/article/details/6650491 本附录说明了那些可以在束和包的属性列表文件中定义的关键字. 束关键 ...
- JavaWeb关于session生命周期的几种设置方法
一般session的生命周期都是建立在用户登录系统后对用户信息进行一个记录,session类似于你有一张银行卡,而卡里的钱就是属于session存储的信息,卡掉了就不能取出里面的钱. 以前sessio ...
- c++获取读写文本权限
#include<cstdio> #include<iostream> #include<fstream> using namespace std; int tot ...
- Travel(最短路)
Travel The country frog lives in has nn towns which are conveniently numbered by 1,2,…,n1,2,…,n. Amo ...
- ubuntu14.0 hadoop2.4.0 64位基于jdk1.7搭建
注意:hadoop有两种运行模式,安全模式和非安全模式.安装模式是以指定在健壮的,基于身份验证上运行的,本文无需运行在非安全模式下,可以直接使用root用户. 本文用户是基于root用户来运行的 一. ...
- 通知url必须为直接可访问的url,不能携带参数 异步接收微信支付结果通知的回调地址 不能携带参数。 回调地址后是否可以加自定义参数 同步回调地址 异步回调地址 return_url和notify_url的区别
[微信支付]微信小程序支付开发者文档 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_7 通知url必须为直接可访问的 ...