求给定两个排序好的数组中第k大的数
这个问题比求两个长度相等的排序数组的上中位数难度要高一点,难就难在不是求中位数了,但是我们要学会举一反三,可以尝试通过分析将求第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大的数的更多相关文章
- [经典算法题]寻找数组中第K大的数的方法总结
[经典算法题]寻找数组中第K大的数的方法总结 责任编辑:admin 日期:2012-11-26 字体:[大 中 小] 打印复制链接我要评论 今天看算法分析是,看到一个这样的问题,就是在一堆数据 ...
- 查找数组中第k大的数
问题: 查找出一给定数组中第k大的数.例如[3,2,7,1,8,9,6,5,4],第1大的数是9,第2大的数是8-- 思考:1. 直接从大到小排序,排好序后,第k大的数就是arr[k-1]. 2. ...
- 寻找数组中第K大的数
给定一个数组A,要求找到数组A中第K大的数字.对于这个问题,解决方案有不少,此处我只给出三种: 方法1: 对数组A进行排序,然后遍历一遍就可以找到第K大的数字.该方法的时间复杂度为O(N*logN) ...
- 无序数组中第K大的数
1. 排序法 时间复杂度 O(nlogn) 2. 使用一个大小为K的数组arr保存前K个最大的元素 遍历原数组,遇到大于arr最小值的元素时候,使用插入排序方法,插入这个元素 时间复杂度,遍历是 O( ...
- 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 ...
- 查找无序数组中第K大的数
思路: 利用快速排序的划分思想 可以找出前k大数,然后不断划分 直到找到第K大元素 代码: #include <iostream> #include <algorithm> # ...
- 求数列中第K大的数
原创 利用到快速排序的思想,快速排序思想:https://www.cnblogs.com/chiweiming/p/9188984.html array代表存放数列的数组,K代表第K大的数,mid代表 ...
- 【每日一题】【找到位置返回&升序数组中第K大就是n-K小】2022年1月17日-NC88 寻找第K大
描述有一个整数数组,请你根据快速排序的思路,找出数组中第 k 大的数. 给定一个整数数组 a ,同时给定它的大小n和要找的 k ,请返回第 k 大的数(包括重复的元素,不用去重),保证答案存在. 方法 ...
- 9.11排序与查找(一)——给定两个排序后的数组A和B,当中A的末端有足够的缓冲空间容纳B。将B合并入A并排序
/** * 功能:给定两个排序后的数组A和B,当中A的末端有足够的缓冲空间容纳B.将B合并入A并排序. */ /** * 问题:假设将元素插入数组A的前端,就必须将原有的元素向后移动,以腾出空间. ...
- [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 ...
随机推荐
- 洛谷P1102 过河卒
P1102 过河卒 链接在此 过河卒 此题如果直接忽略掉马的影响的话,可以看出很简单的递推规律 即 \[dp[i][j]=dp[i-1][j]+dp[i][]j-1] \] 也就是说,由于卒只能走直线 ...
- 使用 WPF + Chrome 内核实现高稳定性的在线客服系统复合应用程序
对于在线客服与营销系统,客服端指的是后台提供服务的客服或营销人员,他们使用客服程序在后台观察网站的被访情况,开展营销活动或提供客户服务.在本篇文章中,我将详细介绍如何通过 WPF + Chrome 内 ...
- .NET Core开发实战(第33课:集成事件:使用RabbitMQ来实现EventBus)--学习笔记(上)
33 | 集成事件:使用RabbitMQ来实现EventBus 这一节我们来讲解如何通过 CAP 组件和 RabbitMQ 来实现 EventBus 要实现 EventBus,我们这里借助了 Rabb ...
- Linux shell 判断变量是否包含某个字符串的几种方法
方法一:利用grep查找 strA="long string" strB="string" result=$(echo $strA | grep "$ ...
- Apache Hudi 设计与架构解读
1. 简介 Apache Hudi(简称:Hudi)允许您在现有的hadoop兼容存储之上存储大量数据,同时提供两种原语,使得除了经典的批处理之外,还可以在数据湖上进行流处理. 这两种原语分别是: 1 ...
- LTspice XVII使用笔记
安装 前往官网下载 https://www.analog.com/cn/design-center/design-tools-and-calculators/ltspice-simulator.htm ...
- 【Unity3D】程序纹理简单应用
1 几何纹理应用 本文所有案例的完整资源详见→Unity3D程序纹理简单应用. 1.1 边框 1)边框子图 Border.shadersubgraph 说明:Any 节点用于判断输入向 ...
- Springboot+Vue+ElementUI实现的宿舍管理系统
项目说明 doman是一个基于Springboot+Vue实现的前后端分离的宿舍管理系统.项目为本人亲手打造,需要的朋友可以拿去做个修改也是不错的.大神请忽略:) 项目功能 详细请看功能演示: Spr ...
- Auxiliary Set题解
F Auxiliary Set 树上LCA + DFS 注意一下输出格式! #include<bits/stdc++.h> using namespace std; const int N ...
- win32 - 多字节下的中文字符打印到文本中
#include <Windows.h> #include <stdio.h> #include <io.h> #include <fcntl.h> # ...