求给定两个排序好的数组中第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 ...
随机推荐
- Oracle 19c RAC自动应用RU补丁过程
笔者好久没有使用opatchauto打过补丁了,搜了下自己的历史随笔,上次opatchauto打补丁的记录还是Oracle 11g版本: Oracle 11g RAC 自动应用PSU补丁简明版 而11 ...
- Oracle ADG + Keepalived 切换演练
客户的一套生产环境采用的架构是Oracle ADG + Keepalived,近期需要进行切换演练,要求我这边保障.ADG本身切换倒没啥可说的,但引入keepalived软件,就需要提前研究下这个架构 ...
- NC16466 [NOIP2015]信息传递
题目链接 题目 题目描述 有 n 个同学(编号为 1 到 n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为Ti的同学. 游戏开始时, ...
- Java设计模式-桥接模式Bridge
传统模式 案例 要求对不同手机类型的不同品牌实现操作编程(比如:开机.关机.上网,打电话等),如图: 类图 问题 扩展性问题(类爆炸),如果我们再增加手机的样式(旋转式),就需要增加各个品牌手机的类, ...
- Oracle如何限制非法调用包中过程
原文:http://www.oracle.com/technetwork/issue-archive/2015/15-jan/o15plsql-2398996.html 假如我有一个包P_A,其中封装 ...
- Java Console类
用于从控制台设备读取字符信息,通常是文本和密码.尤其读取密码字符时是看不见的. 下面给出一个例子: import java.io.Console; /** * @author xusucheng * ...
- pikachu 水平越权,垂直越权
水平越权 查看到其他用户的信息或者通过其他用户去编辑或修改其他用户的信息 1. 用lucy/123456登录 2. 点击查看信息 3. 使用burpsuite拦截请求 GET /vul/overper ...
- 【LeetCode剑指offer#05】回文链表的两种解法+删除链表中间节点(链表的基本操作)
回文链表 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表.如果是,返回 true :否则,返回 false . 示例 1: 输入:head = [1,2,2,1] 输出:true 示 ...
- 【LeetCode链表#10】删除链表中倒数第n个节点(双指针)
删除链表倒数第N个节点 力扣题目链接(opens new window) 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. 进阶:你能尝试使用一趟扫描实现吗? 示例 1: 输入:he ...
- 第一百一十八篇: JavaScript 原型链式继承
好家伙,好家伙,本篇为<JS高级程序设计>第八章"对象.类与面向对象编程"学习笔记 1.原型链 原型链是JS实现"继承"的方案之一 ECMA-262 ...