求给定两个排序好的数组中第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 ...
随机推荐
- 洛谷P1923 求第K小的数 研讨关于输入输出效率的问题(scanf and cin ,printf and cout)
最简单的思想就是将这n个数从小到大排序,然后直接输出下标为K的数,不用想肯定会超时,三个测试点过了,另外两个超时. 那么我想的就是,既然全排序会超时,有没有什么方法可以不用全排序也可以拿出第K小的数呢 ...
- 9.文件和异常--《Python编程:从入门到实践》
9.1 从文件中读取数据 要使用文本文件中的信息,首先需要将信息读取到内存中.为此,你可以一次性读取文件的全部内容,也可以以每次一行的方式逐步读取. 9.1.1 读取整个文件 with open( ...
- C++ map自定义比较函数遵守严格弱序
C++ map自定义比较函数遵守严格弱序 问题背景及定位 背景:这个问题是在将tablesaw(一个Java的数据处理项目)迁移到C++时出现的. 问题位置:SplitOn()函数,在数据流水线中的a ...
- .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
前言 很多同学都不愿给电脑设动态壁纸,其中有个重要原因就是嫌它占资源过多.今天大姚分享一个.NET开源.免费(MIT license)的一个小而快并且功能强大的 Windows 动态桌面软件,支持视频 ...
- NC17872 CSL的校园卡
题目链接 题目 题目描述 今天是阳光明媚,晴空万里的一天,CSL早早就高兴地起床走出寝室到校园里转悠. 但是,等到他回来的时候,发现他的校园卡不见了,于是他需要走遍校园寻找它的校园卡.CSL想要尽快地 ...
- renren-fast-vue@1.2.2 项目编译报错: build `gulp`
问题呈现: PS D:\Code\Java\ideaWorkspace\renren-fast-vue> npm run build > renren-fast-vue@1.2.2 bui ...
- Python递归遍历目录并删除文件中的前N行
1 import os 2 3 # 遍历目录下的所有文件 4 def check_file(file_path): 5 os.chdir(file_path) 6 print(os.path.absp ...
- Clock题解
Clock 题意:给一些时间,24小时制,给一个初始出发时间,问在钟表上最少转多少度能把所有给的时间都经历一遍. 思路:分四种情况模拟. 注意: 求的是度数,所以最后要乘6转换. 3:00,转到15: ...
- 高并发时为什么推荐ReentrantLock而不是synchronized
目录 1.最初的 synchronized 2.synchronized 的优化 3.但是,JAVA的最终答案 JDK 21 LTS 来了 1.最初的 synchronized 它默认对临界资源添加重 ...
- .Net 6 WebAPI 使用JWT进行 授权认证配置
.Net 6 WebAPI 使用JWT进行 授权认证 1.安装组件(Nuget) Microsoft.AspNetCore.Authentication.JwtBearer 2.Program.cs ...