LeetCode#5 两个排序数组的中位数
中位数是 2.0
中位数是 (2 + 3)/2 = 2.5
import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner; public class MedianSortedArrays {
public static void main(String[] args) throws IOException{
/*获取输入内容*/
Scanner input = new Scanner(System.in);
System.out.println("请输入第一个数组,元素间以逗号隔开:");
int[] nums1=stringToArray(input.nextLine());
System.out.println("请输入第二个数组,元素间以逗号隔开:");
int[] nums2=stringToArray(input.nextLine());
System.out.println("这两个数组的中位数是:");
Solution getMedian=new Solution();
Arrays.sort(nums1);
Arrays.sort(nums2);
double median=getMedian.findMedianSortedArrays(nums1,nums2);
System.out.println(median);
} /**
* 将获取的字符串转为数组
*/
public static int[] stringToArray(String str){
String[] strArr= str.split(",");
int[] arr=new int[strArr.length];
for(int i=0;i<strArr.length;i++){
arr[i]=Integer.parseInt(strArr[i].trim());
}
return arr;
}
} class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
double midian;
int[] index=getIndex(nums1.length+nums2.length);
midian=getMedian(nums1,nums2,index);
return midian;
} /**
* 获取中位数在组合后的数组中应当存在的位数
* @param arrLength
* @return
*/
public int[] getIndex(int arrLength){
int[] index =new int[2];
index[0]=(arrLength-1)/2;//(数组长度-1)/2为中位数在有序数组中的下标之一
if(arrLength%2==0){ //当数组长度为偶数,则中位数是(数组长度-1)/2和(数组长度-1)/2+1这两个下标对应元素的平均值
index[1]=index[0]+1;
}
return index;
} /**
* 获取中位数
* @param nums1
* @param nums2
* @param index 中位数下标对应数组[(数组长度-1)/2,(数组长度-1)/2+1]或[(数组长度-1)/2,0]
* @return
*/
public double getMedian(int[] nums1, int[] nums2,int[] index){
double sum=0; //记录中位数对应下标两个元素之和
int maxIndex; //记录中位数下标数组的较大数
double indexLength; /*此处获取中位数最大下标作为循环标记*/
if(index[1]==0){
maxIndex=index[0];
indexLength=1;
}else{
maxIndex=index[1];
indexLength=2;
} /*获取两个数组中的对应下标元素之和*/
int j=0,k=0,thisIndex=0,thisNum = 0;
while(thisIndex<=maxIndex){
if(j<nums1.length&&k<nums2.length){ //当两个数组均可遍历时
if(nums1[j]>=nums2[k]){ //比较元素大小,当某一数组元素小,便推向该数组下一个元素
thisNum=nums2[k]; //记录比较所得的较小元素,作为thisNum
k++;
}else{
thisNum=nums1[j];
j++;
}
}else{ //当有数组遍历结束,但仍未找到中位数时
if(j==nums1.length){ //遍历完的数组不再参与thisNum的记录,只进行另外一个数组的遍历
thisNum=nums2[k];
k++;
}
if(k==nums2.length){
thisNum=nums1[j];
j++;
}
} if(thisIndex==maxIndex){ //若遍历的次数达到中位数下标要求,便做和,记录中位数相关元素之和
sum+=thisNum;
}
if(index[1]!=0&&thisIndex==maxIndex-1){
sum+=thisNum;
} thisIndex++; //遍历标记
}
return sum/indexLength; //返回中位数
}
}
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int m = nums1.length, n = nums2.length, left = (m + n + 1) / 2, right = (m + n + 2) / 2;
return (findKth(nums1, nums2, left) + findKth(nums1, nums2, right)) / 2.0;
}
int findKth(int[] nums1, int[] nums2, int k) {
int m = nums1.length, n = nums2.length;
if (m > n) return findKth(nums2, nums1, k);
if (m == 0) return nums2[k - 1];
if (k == 1) return Math.min(nums1[0], nums2[0]);
int i = Math.min(m, k / 2), j = Math.min(n, k / 2);
if (nums1[i - 1] > nums2[j - 1]) {
return findKth(nums1, Arrays.copyOfRange(nums2, j, n), k - j);
} else {
return findKth(Arrays.copyOfRange(nums1, i, m), nums2, k - i);
}
}
}
LeetCode#5 两个排序数组的中位数的更多相关文章
- LeetCode 4 - 两个排序数组的中位数 - [分治]
题目链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/description/ 给定两个大小为 m 和 n 的有序数组 n ...
- leetcode 4.两个排序数组的中位数
题目: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 你可以假设 nums1 和 nums ...
- leetcode,两个排序数组的中位数
先上题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 你可以假设 nums1 和 ...
- leetcode python两个排序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 你可以假设 nums1 和 nums2 不同 ...
- LeetCode(4):两个排序数组的中位数
Hard! 题目描述: 有两个大小为 m 和 n 的排序数组 nums1 和 nums2 . 请找出两个排序数组的中位数并且总的运行时间复杂度为 O(log (m+n)) . 示例 1: nums1 ...
- LeetCode4. 两个排序数组的中位数
4. 两个排序数组的中位数 问题描述 There are two sorted arrays nums1 and nums2 of size m and n respectively.Find the ...
- 2.Median of Two Sorted Arrays (两个排序数组的中位数)
要求:Median of Two Sorted Arrays (求两个排序数组的中位数) 分析:1. 两个数组含有的数字总数为偶数或奇数两种情况.2. 有数组可能为空. 解决方法: 1.排序法 时间复 ...
- LeetCode-4. 两个排序数组的中位数(详解)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/description/ 有两个大小为 m 和 n 的排序数组 nums ...
- JavaScript实现获取两个排序数组的中位数算法示例
本文实例讲述了JavaScript排序代码实现获取两个排序数组的中位数算法.分享给大家供大家参考,具体如下: 题目 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个 ...
随机推荐
- C/C++规范学习:
一 关于浮点数: 1.1浮点数是否等于0判断:因为浮点数都有精度,不能拿浮点数直接和0.0f进行比较,而应该采用以下方法: if (f32Data == 0.0f) // 隐含错误的比较 #defin ...
- Java面向对象_数据结构之链表
链表:是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里村到下一个节点的指针. 在链表数据结构中,需要使用到递归算法.递归算法是一种直接或间接地调用自身算法的过 ...
- Unity C# 调用SaveFileDialog保存Excel文件
本文原创,转载请注明出处:http://www.cnblogs.com/AdvancePikachu/p/6893934.html 本文学习如何把数据转存为Excel文件并调用SaveFileDial ...
- Spring cloud Eureka 服务治理(高可用服务中心)
在微服务的架构中,我们考虑发生故障的情况,所以在生产环境中我们需要对服务中各个组件进行高可用部署. Eureka Server 的高可用实际上就是将自己作为服务想其它服务注册中心注册自己,这样就形成了 ...
- Backbone源码风格
代码风格: 一.自执行匿名函数创建执行环境 var root = this; root保存全局执行环境的指针.浏览器端为window对象 二.依赖库 (1).underscore 如果bac ...
- path的join和resolve
连接路径:path.join([path1][, path2][, ...]) path.join()方法可以连接任意多个路径字符串.要连接的多个路径可做为参数传入. path.join()方法在接边 ...
- 【干货】JavaScript DOM编程艺术学习笔记7-9
七.动态创建标记 在文档中不写占位图片和文字代码,在能调用js的情况下动态创建,文档支持性更好. 在原来的addLoadEvent prepareGallery showPic的基础上增加函数prep ...
- 12个非常不错的javascript类库
Javascript是一个解释性的编程语言.最初作为浏览器的一部份在浏览器中运行,可以和用户交互,并且控制浏览器,异步通讯,修改显示的document.在这篇文章中,我们收集了12款最新的Javasc ...
- 配置海康IPC或大华IPC通过路由器公网访问
设备:路由器DLink-DIR-600M,海康IPC:DS-2CD864FWD-E 海康默认端口为8000,HTTP访问为80,RTSP访问端口为554. 配置分成两步,分别为配置IPC相关网络参数和 ...
- 入口类和@SpringBootApplication
SpringBoot通常有一个名为*Application的入口类,入口类里有一个标准的Java应用的入口方法,main方法,在该方法中使用SpringApplication.run(xxxxxApp ...