这个问题比求两个长度相等的排序数组的上中位数难度要高一点,难就难在不是求中位数了,但是我们要学会举一反三,可以尝试通过分析将求第k大的数转化为求中位数。将数组中不可能的数排除,在剩下可能的数中求中位数,这样就会产生3情况:

首先声明:两个数组,长度唱的为lenl,长度短的为lens。

1.k<lens;

2.lens<k<lenl

3,lenl<k<lenl+lens

4.k<1或k>lenl+lens,报错

代码实现:

public class UpMedian{
//求相同长度排序数组的中位数
public static int getUpMedian(int[] arr1,int start1,int end1,int[] arr2,int start2,int end2) {
if(arr1==null || arr1.length<=0 || arr2==null || arr2.length<=0) {
System.out.println("Array is valid");
return -1;
} if(arr1.length!=arr2.length) {
System.out.println("Array length is valid");
return -1;
} int middle1 = 0;
int middle2 =0;
//用来区分数组长度为奇偶数
int offset = 0; while(start1 < end1) {
middle1 = (start1+end1)>>1;
middle2 = (start2+end2)>>1;
offset = ((end1-start1+1)&1)^1; if(arr1[middle1] > arr2[middle2]) {
end1=middle1;
start2=middle2+offset;
} else if(arr1[middle1] < arr2[middle2]) {
start1 = middle1 +offset;
end2 = middle2;
} else {
return arr1[middle1];
}
} return Math.min(arr1[start1], arr2[start2]);
} public static int fingKthNum(int[] arr1, int[] arr2, int k) {
if(arr1==null || arr2==null || arr1.length<=0 || arr2.length<=0) {
throw new RuntimeException("Array is valid");
} if(k<1 || k>(arr1.length+arr2.length)) {
throw new RuntimeException("kth is valid");
} int res = 0;
int[] longs = arr1.length>arr2.length ?arr1 : arr2;
int[] shorts = arr1.length>arr2.length ?arr2 : arr1; int l = longs.length;
int s = shorts.length; if(k<=s) {
res = getUpMedian(arr1, 0, k-1, arr2, 0, k-1);
} else if(k<=l) {
if(longs[k-s-1]>=shorts[s-1]) {
res = longs[k-s-1];
} else {
res = getUpMedian(shorts, 0, s-1, longs, k-s, k-1);
}
} else if(k>l){
if(longs[k-s-1]>=shorts[s-1]) {
res = longs[k-s-1];
} else if(shorts[k-l-1]>=longs[l-1]) {
res = shorts[k-l-1];
} else {
res = getUpMedian(shorts, k-l, s-1, longs, k-s, l-1);
}
}
return res;
} public static void main(String[] args) {
int[] a1 = {1,2,5,7};
int[] a2 = {2,3,8,10};
System.out.println(fingKthNum(a1, a2, 4));
}
}

求给定两个排序好的数组中第k大的数的更多相关文章

  1. [经典算法题]寻找数组中第K大的数的方法总结

    [经典算法题]寻找数组中第K大的数的方法总结 责任编辑:admin 日期:2012-11-26   字体:[大 中 小] 打印复制链接我要评论   今天看算法分析是,看到一个这样的问题,就是在一堆数据 ...

  2. 查找数组中第k大的数

    问题:  查找出一给定数组中第k大的数.例如[3,2,7,1,8,9,6,5,4],第1大的数是9,第2大的数是8-- 思考:1. 直接从大到小排序,排好序后,第k大的数就是arr[k-1]. 2. ...

  3. 寻找数组中第K大的数

    给定一个数组A,要求找到数组A中第K大的数字.对于这个问题,解决方案有不少,此处我只给出三种: 方法1: 对数组A进行排序,然后遍历一遍就可以找到第K大的数字.该方法的时间复杂度为O(N*logN) ...

  4. 无序数组中第K大的数

    1. 排序法 时间复杂度 O(nlogn) 2. 使用一个大小为K的数组arr保存前K个最大的元素 遍历原数组,遇到大于arr最小值的元素时候,使用插入排序方法,插入这个元素 时间复杂度,遍历是 O( ...

  5. 4. Median of Two Sorted Arrays *HARD* -- 查找两个排序数组的中位数(寻找两个排序数组中第k大的数)

    There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...

  6. 查找无序数组中第K大的数

    思路: 利用快速排序的划分思想 可以找出前k大数,然后不断划分 直到找到第K大元素 代码: #include <iostream> #include <algorithm> # ...

  7. 求数列中第K大的数

    原创 利用到快速排序的思想,快速排序思想:https://www.cnblogs.com/chiweiming/p/9188984.html array代表存放数列的数组,K代表第K大的数,mid代表 ...

  8. 【每日一题】【找到位置返回&升序数组中第K大就是n-K小】2022年1月17日-NC88 寻找第K大

    描述有一个整数数组,请你根据快速排序的思路,找出数组中第 k 大的数. 给定一个整数数组 a ,同时给定它的大小n和要找的 k ,请返回第 k 大的数(包括重复的元素,不用去重),保证答案存在. 方法 ...

  9. 9.11排序与查找(一)——给定两个排序后的数组A和B,当中A的末端有足够的缓冲空间容纳B。将B合并入A并排序

    /**  * 功能:给定两个排序后的数组A和B,当中A的末端有足够的缓冲空间容纳B.将B合并入A并排序. */ /** * 问题:假设将元素插入数组A的前端,就必须将原有的元素向后移动,以腾出空间. ...

  10. [LeetCode] Kth Largest Element in an Array 数组中第k大的数字

    Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...

随机推荐

  1. 18. 默认堆/创建堆--《Windows核心编程》

    Windows 提供了以下三种机制来对内存进行操控虚拟内存:最适合用来管理大量对象数组或者大型数据结构内存映射文件:最适合用来管理大型数据流(通常是文件),以及在同一机器上运行的多个进程之间的共享数据 ...

  2. Kafka-分布式安装

    一.kafka是什么? Kafka是一个快速.可扩展的.高吞吐.可容错的分布式发布订阅消息系统.Kafka具有高吞吐量.内置分区.支持数据副本和容错的特性,它可以处理消费者规模的网站中的所有动作流数据 ...

  3. Linux-CentOS7登录页面出现Hint: caps lock on,输入大小写字母反了(大小写反转问题)

    问题描述:虚拟机CentOS7,输入大小写字母反了,开启capslock的时候变成小写字母了,关闭则变成大写了... 解决办法:只需要执行:setleds +caps 或 setleds -caps  ...

  4. docker离线安装及设置默认存储目录

    一.离线安装Docker 在内网环境下,一般不能联网在线部署,这时候就需要以离线的方式安装docker.本文介绍在CentOS 7.6环境中离线安装docker的步骤. 1. 下载docker安装包 ...

  5. Flink-SQL数据去重

    Flink去重语句 您可以通过多种方式实现去重需求,例如FIRST_VALUE.LAST_VALUE和DISTINCT等.本文为您介绍如何使用TopN方法实现去重,以及使用过程中的注意事项. 去重的方 ...

  6. NC24911 数独挑战

    题目链接 题目 题目描述 数独是一种填数字游戏,英文名叫 Sudoku,起源于瑞士,上世纪 70 年代由美国一家数学逻辑游戏杂志首先发表,名为 Number Place,后在日本流行,1984 年将 ...

  7. etcd实现分布式锁分析

    3篇关于分布式锁的文章,可以结合看: consul实现分布式锁:https://www.cnblogs.com/jiujuan/p/10527786.html redis实现分布式锁:https:// ...

  8. .Net Code Excel 文件导入

    第一步 下载NuGet NPOI包 /// <summary> /// 将excel文教导入到订单表 /// </summary> /// <param name=&qu ...

  9. 使用Gulp压缩静态资源

    如果希望对在静态页面中引入的相关资源进行压缩(比如:CSS,JavaScript,图片等),可以使用Gulp实现. 当然,还可以使用其他打包工具,比如:Grunt,Webpack等等. Gulp是什么 ...

  10. typing模块中Protocol协议的使用

    说明 在 Python 的 typing 模块中,Protocol 是一个用于定义协议(Protocol)的类. 协议是一种形式化的接口,定义了一组方法或属性的规范,而不关心具体的实现.Protoco ...