Java实现Median of Two Sorted Arrays

JAVA:实现求Median中位数算法(附完整源码) 阅读详情

算法描述:

求出两个有序数组的中位数。

public class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
    	if (nums1 == null || nums1 == null)
    		throw new NullPointerException();
    	int nums1L = nums1.length;
    	int nums2L = nums2.length;
    	int length = nums1L + nums2L;
    	//需要一个计数器来记录比较次数(需要比较length/2 )
    	int count = 0;
    	//指示两个数组的当前位置
    	int i = 0;
    	int j = 0;
    	//检查数组nums1和nums2为空的情况
    	if (nums1L < 1 && nums2L < 1)
    		return 0;
    	else if (nums1L < 1) {
    		//元素个数为奇数
    	    if (length == 1) return nums2[j];
    		if (length % 2 != 0) {
    			//如果数组1元素个数为0,从当前位置遍历数组2
    			while (j < nums2L) {
    				count++;
    				j++;
    				if (count == (length / 2)) return nums2[j];
    			}
    		} else {
    			//如果数组1元素个数为0,从当前位置遍历数组2
    			while (j < nums2L) {
    				count++;
    				j++;
    				if (count == (length / 2)) return ((double)nums2[j - 1] +nums2[j]) / 2;
    			}
    		}
    	} else if (nums2L < 1) {
    		if (length == 1) return nums1[i];
    		if (length % 2 != 0) {
    			//如果数组2元素个数为0,从当前位置遍历数组2
    			while (i < nums1L) {
    				count++;
    				i++;
    				if (count == (length / 2)) return nums1[i];
    			}
    		} else {
    			//如果数组2元素个数为0,从当前位置遍历数组1
    			while (i < nums1L) {
    				count++;
    				i++;
    				if (count == (length / 2)) return ((double)nums1[i - 1] +nums1[i]) / 2;
    			}
    		}
    		
    	}	
    	// 判断length是奇数还是偶数
    	//如果是奇数,则取中间的那一位
    	if (length % 2 != 0) {
    		//遍历这两个数组,有两种情况发生:1.在没到达边界前计算出中间位置2.到达边界以后算出中间位置
    		while (i < nums1L && j < nums2L) {  			
    			//当count = length / 2时,到了中间的位置,获取它的值
    			count++;
    			if (nums1[i] < nums2[j]) {
    				i++;
    				if (count == (length / 2) && i < nums1L) {
    					if (nums1[i] < nums2[j]) 	  return nums1[i];
    				    else                     	  return nums2[j];
        			} else if (count == (length / 2) && i == nums1L) {
        				if (nums1[ i- 1] < nums2[j])  return nums2[j];
        				else 						  return nums1[ i - 1];
        			} else if (i == nums1L)			  break;
    			} else {
    				j++;
    				if (count == (length / 2) && j < nums2L) {
    					if (nums2[j] < nums1[i]) 	  return nums2[j];
    					else 					 	  return nums1[i];
        			} else if (count == (length / 2) && j == nums2L) {
        				if (nums2[ j - 1] < nums1[i]) return nums1[i];
        				else 						  return nums2[ j - 1];
        			} else if (j == nums2L)			  break;
    			} 			
    		}
    		//数组到达边界,分析是哪种情况:1.数组1到达边界;2.数组2到达边界
    		if (i == nums1L) {
    			//如果数组1越界,从当前位置遍历数组2
    			while (j < nums2L) {
    				count++;
    				j++;
    				if (count == (length / 2)) return nums2[j];
    			}
    		} else if (j == nums2L) {
    			//如果数组2越界,从当前位置遍历数组1
    			while (i < nums1L) {
    				count++;
    				i++;
    				if (count == (length / 2)) return nums1[i];
    			}
    		}	
    	} else {
    		//否则取中间两位的平均
    		//遍历这两个数组,有两种情况发生:1.在没到达边界前计算出中间位置2.到达边界以后算出中间位置
    		while (i < nums1L && j < nums2L) {  			
    			//当count = length / 2时,到了中间的位置,获取它的值
    			count++;
    			if (nums1[i] < nums2[j]) {
    				i++;
    				if (count == (length / 2) && i < nums1L) {
    					if (nums1[i] < nums2[j]) {
    						return ((double)nums1[i - 1] +nums1[i]) / 2;
    					}
    				    else {
    				    	return ((double)nums2[j] + nums1[i - 1]) / 2; 
    				    }
        			} else if (count == (length / 2) && i == nums1L) {
        				return ((double)nums1[i - 1] +nums2[j]) / 2;
        			} else if (i == nums1L)			  break;
    			} else {
    				j++;
    				if (count == (length / 2) && j < nums2L) {
    					if (nums2[j] < nums1[i]) {
    						return ((double)nums2[j - 1] +nums2[j]) / 2;
    					}
    				    else {
    				    	return ((double)nums1[i] + nums2[j - 1]) / 2; 
    				    }
        			} else if (count == (length / 2) && j == nums2L) {
        				return ((double)nums2[j - 1] +nums1[i]) / 2;
        			} else if (j == nums2L)			  break;
    			}	
    		}
    		//数组到达边界,分析是哪种情况:1.数组1到达边界;2.数组2到达边界
    		if (i == nums1L) {
    			//如果数组1越界,从当前位置遍历数组2
    			while (j < nums2L) {
    				count++;
    				j++;
    				if (count == (length / 2)) return ((double)nums2[j] + nums2[j - 1]) / 2; 
    			}
    		} else if (j == nums2L) {
    			//如果数组2越界,从当前位置遍历数组1
    			while (i < nums1L) {
    				count++;
    				i++;
    				if (count == (length / 2)) return ((double)nums1[i] + nums1[i - 1]) / 2;
    			}
    		}
    	}
    	return 0;    
    }
}


笔记:

  1. 变量定义在最前面,这样代码读起来更好;
  2. 方法要先进行传入参数的检查,确保传入参数正确;
  3.  对特殊情况要先考虑清楚,在这个题中,要考虑其中一个或两个元素个数都为的情况;
  4. 算法在考虑效率时,并列条件只考虑最复杂的一个条件。循环是主要的效率考虑。

LeetCode4 Median of Two Sorted Arrays There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)). Java AC版本 立即下载

相关推荐

告别拼音!用VSCode+Dosbox-X搞定汇编语言课程设计里的中文姓名显示

本文详细介绍了如何利用VSCode和Dosbox-X解决汇编语言课程设计中中文姓名显示的问题。通过配置开发环境、理解GB2312编码及正确使用汇编指令,学生可以告别拼音显示,实现中文字符的正确输出。文章还提供了完整的代码示例和常见问题排查方法,帮助读者快速掌握这一实用技能。

weixin_30872337的博客 425

java快速查找中位数_用QuickSort快速查找中位数(median)

中位数(median)是一个排好序的元素中中间位置的元素,如果元素个数为偶数,则是中间两个元素的平均值。例如(3,1,5)的中位数是3,而(2,1,3,5)的中位数是2.5。查找中位数属于SelectionAlgorithms的一种。用快速排序可以做到每次divide之后,只需要conquer一个分支,时间复杂度为O(nlogn)。为便于比较,以下代码包含quicksort的算法实现:public...

weixin_42127835的博客 859

基于PlatformIO与CMSIS的STM32库函数开发实战:从环境搭建到外设驱动

本文详细介绍了基于PlatformIO与CMSIS的STM32库函数开发实战,从环境搭建到外设驱动实现。通过对比传统IDE,PlatformIO结合CMSIS框架在跨平台开发、代码可移植性和调试体验上更具优势。文章包含PlatformIO.ini配置详解、GPIO/USART驱动开发实例及常见问题解决方案,帮助开发者高效完成STM32项目开发。

weixin_29190169的博客 423

(Java)1029 Median

给定N个整数的递增序列S,中值是位于中间位置的数字。例如,S1={11,12,13,14}的中值是12,S2={9,10,15,16,17}的中值为15。两个序列的中值被定义为包含两个序列所有元素的非递减序列的中值。例如,S1和S2的中值为13。给定两个递增的整数序列,要求您找到它们的中值。

qq_74217055的博客 159

深度强化学习系列(13): 策略梯度(Policy Gradient)

对于DQN来说使用一个网络直接逼近了值函数,最后取得了非常不错的效果, 但是对于一些连续性控制或者动作空间特别大的环境来说,很难全部计算所有的值函数来得到最好的策略,那么直接计算策略的方法就别提出来了。 回顾一下前面几篇,所谓的策略,其实就是状态到动作的映射数学表达为 π:s→aπ:s→a\pi : s \to a, 我们用ττ\tau 表示状态s到最后一个状态的一个序列,表示为: τ:st...

深度强化学习(DeepRL)探索博客 4642

硬件基础(4):(7)ADC电压采集:软件校准(标定、拟合)

在实际项目中,**软件端校准**可以有效弥补硬件方面(分压电阻误差、放大器失调、参考源误差等)带来的系统性偏差,从而提高 ADC 测量精度。下面是一个常见的**多点实测校准**流程与思路,个人感觉传感器标定的原理也只这样。

FCZlll的博客 6241

java输出数据的平均数和众数_平均值mean,众数mode,中值median 和 标准差stddev

均值,众数,中位数,标称差:均值是就全部数据计算的,它具有优良的数学性质,是实际中应用最广泛的集中趋势测度值.其主要缺点是易受数据极端值的影响,对于偏态分布的数据,均值的代表性较差.作为均值变形的调和平均数和几何平均数,是适用于特殊数据的代表值,调和平均数主要用于不能直接计算均值的数据,几何平均数则主要用于计算比率数据的平均数,这两个测度值与均值一样易受极端值的影响.一般代表算术平均值。也就是:比...

weixin_36334361的博客 932

Android14 Qcom 从Framework到Driver带你打开WIFI(二)

上篇文章讲到了UI打开WIFI以后,逐步调用到加载底层驱动以及通知等相关流程。这篇接着上文继续往下看WIFI ON的后续动作。

IAYLBL的博客 766

java中求中位数_java 计算中位数的实现方法

最近工作需要 要求把python的代码写成java版本,python中有一个np.median()求中位数的方法,java决定手写一个先说说什么是中位数:中位数就是中间的那个数,如果一个集合是奇数个,那么中位数就是按大小排列后,最中间那个数,如果一个集合是偶数个,那么中位数就是按大小排列后,最中间那2个数的平均数。比如:1,2,3,4,5 那中位数就是31,2,3,4,5,6 那中位数就是 (3+...

weixin_28749997的博客 6489

Arduino、ESP32驱动SFA40甲醛传感器(气体传感器篇)

SFA40甲醛传感器是一款基于盛思锐电化学原理的专业HCHO检测模块,具备卓越的抗酒精干扰能力(乙醇交叉敏感度<0.3%)、高达±20ppb的检测精度及0~1000ppb的宽量程。该传感器内置SHT4X温湿度传感器进行自动补偿,确保数据的长期稳定性;其小尺寸、低功耗的特性,可快速集成至智能家居、空气净化器、物联网环境监测等系统中,实现对甲醛浓度的精准、可靠监测。

不脱发的程序猿 302

AI原生应用中的数据治理:从采集到应用的完整方案

当AI从"辅助工具"进化为"应用核心"(如ChatGPT、智能驾驶系统),传统数据管理方式已无法满足需求:模型需要更精准的训练数据、业务需要更实时的决策支持、法规需要更严格的隐私保护。本文聚焦AI原生应用的数据全生命周期治理(从采集→清洗→标注→存储→应用→归档的完整链路),覆盖技术方案、工具选择和实践要点。本文将按"场景引入→核心概念→技术方案→实战案例→未来趋势"的逻辑展开,重点通过"奶茶店原料管理"类比,解释数据治理的关键环节;结合Python代码演示核心技术(如异常值检测、主动学习标注);

SuperAGI2025 883

[LeetCode][4]Median of Two Sorted Arrays解析 -Java实现

Q: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)). A: 这个题目大致是说给你两个被排序

一些奇奇怪怪的解法 683

运维颠覆!一文解锁AI赋能运维实战秘籍,效率飙升!

将AI应用于运维工作是一场极具价值的变革,从故障预测与诊断到自动化任务执行,再到资源管理优化,AI都展现出巨大潜力。尽管在实践过程中会面临数据质量、模型复杂性等挑战,但通过合理的技术选型和解决方案,我们能够充分挖掘AI的优势,实现运维工作的高效、智能转型。持续探索和创新AI在运维领域的应用,将为企业的数字化发展提供坚实保障。在科技飞速发展的当下,运维领域正经历着深刻变革,AI的融入成为提升运维效率与质量的关键。本文将深入实战,带你领略AI如何在运维各环节大显身手,让你的运维工作开启智能高效新模式。

探索云原生与智能化驱动下的安全运维新范式。关注DevSecOps、可观测性、AIOps等前沿领域,与您共赴技术前沿。 401

Leetcode平台上的Median of Two Sorted Arrays题目用Java快排实现

Leetcode平台上的Median of Two Sorted Arrays题目,大意就是找两个已排序数组的中位数。今天先用快排的方式实现一下,代码如下: There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overal

sophie2805的专栏 766

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java实现Leetcood --Median of Two Sorted Arrays

There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).首先想到的是最笨的方法,将两个数组拼接在一起,然后排序,取中

wpxiaoxue的专栏 512

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Leetcode平台上的Median of Two Sorted Arrays题目用Java堆算法实现

代码写的略恶心,明天再详查,改进一下。 这个堆其实是二叉树,用一维数组实现。并非java里面真正意义上的数据结构堆。 三个个小小知识点: 1、java里面int的共2^32个,0当作正数处理,所以int的数据范围是(-2)^31,0,2^31-1 2、java里面switch语句,不能使用布尔值充当判断条件,如下语句是错误的:    switch(a>b){    case 0

sophie2805的专栏 715

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

LeetCode4. Median of Two Sorted Arrays(java实现)

问题描述 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)). You may assume nums1 ...

超悦人生 185

【LeetCode】4. Median of Two Sorted Arrays - Java实现

1. 题目描述: 2. 思路分析: 3. Java代码: 1. 题目描述: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time co...

小怪孩的成长之路 831

LeetCode-java实现-T4Median of Two Sorted Arrays

There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)). 注意:这里要注意的是当m+n是偶数是,返回的是中间

Ronn点滴 458

LeetCode4 Median of Two Sorted Arrays Java实现

描述: There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)). 两个排好序的的数组找中位数,时间复杂度要求O(log (m...

weixin_33714884的博客 65

leetcode:4. Median of Two Sorted Arrays(Java实现)

leetcode测试地址:https://leetcode.com/problems/median-of-two-sorted-arrays/#/description There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted

zjkC050818的博客 587

百度面试题:Median of Two Sorted Arrays(java实现)

即:给定两个排好序的数组nums1和nums2,找出两个数组合并后的中位数。本文介绍一种O(log(Math.min(len1,len2)))复杂度的解法,这也是面试官期望的解法。 难易程度:★ 重要性:★★★★★ 注:先看代码中间部分的思路解析,然后再看具体的代码实现!!! class Solution { public double findMedianSortedArrays(in...

weixin_33674976的博客 77

LeetCode【4】. Median of Two Sorted Arrays --思路图解与java的不同方法实现

Median of Two Sorted Arrays          这道题确实有点难,想挺久,看别人答案也是不能一下子就明白。题目难度为Hard,原题如下: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted

waycaiqi的专栏 2689

LeetCode-4. Median of Two Sorted Arrays [C++][Java]

Given two sorted arraysnums1andnums2of sizemandnrespectively, returnthe medianof the two sorted arrays. The overall run time complexity should beO(log (m+n)).

贫道绝缘子的博客 257

Median of Two Sorted Arrays 两个有序数组的中位数 C++实现 java实现 leetcode系列(四)

两个有序数组的中位数 C++实现 java实现 [LeetCode] 4. Median of Two Sorted Arrays 两个有序数组的中位数 There are two sorted arrays nums1 and nums2 of size m and n respectively.Find the median of the two sorted arrays. The ove...

月已满西楼的博客 261

【LeetCode-面试算法经典-Java实现】【004-Median of Two Sorted Arrays(两个排序数组的中位数)】

【004-Median of Two Sorted Arrays(两个排序数组的中位数)】两个排序数组,找这两个排序数组的中位数,时间复杂度为O(log(m+n))采用类二分查找算法

https://github.com/Wang-Jun-Chao 6012
上一篇: Oracle和Mysql的分页查询语句
下一篇: Java实现Container With Most Water
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值