这个问题比求两个长度相等的排序数组的上中位数难度要高一点,难就难在不是求中位数了,但是我们要学会举一反三,可以尝试通过分析将求第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. [FATAL] [DBT-06103] 端口 (1,521) 已在使用

    今天参考之前文章 Oracle 19c快速安装部署 在一个新的环境进行安装时,发现配置数据库时报错1521端口被占用: [root@OEL7 media]# /etc/init.d/oracledb_ ...

  2. Oracle 11g ADG 部署(duplicate)快速参考

    本文旨在指导客户完成Oracle 11g的ADG部署工作,主库环境已具备,备库环境已安装完成数据库软件. 环境:RHEL 6.8 + Oracle 11.2.0.4 1.确认主库运行在归档模式 2.确 ...

  3. 下载、安装Git并拷贝GitHub项目到本地的流程

      本文介绍分布式开源版本控制系统Git的下载.安装,并基于Git实现克隆GitHub中项目代码的方法.   Git是一款开源软件,因此我们直接在Git的官方下载地址下载最新版本的Git即可.其中,在 ...

  4. ehlib组件包当中TDBLookupComboboxEh的小结

    TDBLookupComboboxEh和TDBGridEh一样强大无比,可以做出Combobox下拉出Grid的效果.下面是一些重要属性的小结(可怜费了我半天功夫,文档太少了.......)(1)Li ...

  5. Net5 WorkService 继承 Quarzt 以及 Net5处理文件上传

    Net5 版本以Core为底层非framework框架的windowservice 服务. 在VS里叫WorkService 可以以CMD方式运行也可以以Windowservice方式运行,部署简单. ...

  6. NC200324 魔改森林

    题目链接 题目 题目描述 曾经有一道叫做迷雾森林的题目,然而牛牛认为地图中的障碍太多,实在是太难了,所以删去了很多点,出了这道题. 牛牛给出了一个n行m列的网格图 初始牛牛处在最左下角的格点上(n+1 ...

  7. Linux 中hdparm命令使用说明——带实例

    详解Linux中hdparm命令查看硬盘信息的用法 功能说明:显示与设定硬盘的参数. 语 法:hdparm [-CfghiIqtTvyYZ][-a ][-A <0或1>][-c ][-d ...

  8. Ubuntu下使用PlatformIO开发STC89/STC12/Arduino

    安装VSCode 从 https://code.visualstudio.com/Download 下载最新的 deb 版, 通过命令行安装 sudo apt install ./code_1.59. ...

  9. 【Unity3D】粒子系统ParticleSystem

    1 简介 ​ 拖尾(TrailRenderer).线段渲染器(LineRenderer).粒子系统(ParticleSystem)是 Unity3D 提供的三大特效,其中粒子系统的功能最为强大,特效也 ...

  10. Java Socket编程系列(三)开发支持单客户端访问的Server

    例子来自Java官方教程,稍作调整. 实现的是单个客户端请求服务端,根据服务端提示进行一系列操作. 协议类: package com.dylan.socket; /** * @author xusuc ...