算法题4 —求两个有序数组的中位数

news/2024/11/29 0:29:27/

文章目录

  • 题目
  • 示例
    • 示例1
    • 示例2
  • 解题
    • 解法1
    • 代码
  • leetcode

题目

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

算法的时间复杂度应该为 O(log (m+n)) 。

示例

示例1

输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2

示例2

输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

解题

解法1

中位数(又称中值,英语:Median),统计学中的专有名词,代表一个样本、种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分。

所以我们只需要将数组进行切。

一个长度为 m 的数组,有 0 到 m 总共 m + 1 个位置可以切。

我们把数组 A 和数组 B 分别在 i 和 j 进行切割。

将 i 的左边和 j 的左边组合成「左半部分」,将 i 的右边和 j 的右边组合成「右半部分」。

  • 当 A 数组和 B 数组的总长度是偶数时,如果我们能够保证

1、左半部分的长度等于右半部分,i + j = m - i + n - j , 也就是 j = ( m + n ) / 2 - i

2、左半部分最大的值小于等于右半部分最小的值 max ( A [ i - 1 ] , B [ j - 1 ])) <= min ( A [ i ] , B [ j ]))。那么,中位数就可以表示(左半部分最大值 + 右半部分最小值 )/ 2 。(max ( A [ i - 1 ] , B [ j - 1 ])+ min ( A [ i ] , B [ j ])) / 2

  • 当 A 数组和 B 数组的总长度是奇数时,如果我们能够保证

1、左半部分的长度比右半部分大 1,i + j = m - i + n - j + 1也就是 j = ( m + n + 1) / 2 - i

2、左半部分最大的值小于等于右半部分最小的值 max ( A [ i - 1 ] , B [ j - 1 ])) <= min ( A [ i ] , B [ j ]))。那么,中位数就是左半部分最大值,也就是左半部比右半部分多出的那一个数。max ( A [ i - 1 ] , B [ j - 1 ])

代码

/*** @author zxn* @ClassName Median* @Description* @createTime 2023年05月29日 19:06:00*/
public class Median {// 输入:nums1 = [1,3], nums2 = [2]//输出:2.00000//解释:合并数组 = [1,2,3] ,中位数 2// 输入:nums1 = [1,2], nums2 = [3,4]//输出:2.50000//解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5public static void main(String[] args) {int[] nums1 = {1, 2}, nums2 = {3, 4};System.out.println("--->" + findMedianSortedArrays(nums1, nums2));}public static double findMedianSortedArrays(int[] arr1, int[] arr2) {int m = arr1.length;int n = arr2.length;if (m > n) {return findMedianSortedArrays(arr2, arr1);}int iMin = 0;int iMax = m;while (iMin <= iMax) {int i = (iMin + iMax) / 2;int j = (m + n + 1) / 2 - i;if (i != m && j != 0 && arr2[j - 1] > arr1[i]) {iMin = i + 1;} else if (i != 0 && j != n && arr1[i - 1] > arr2[j]) {iMax = i - 1;} else {int leftMax = 0;if (i == 0) {leftMax = arr2[j - 1];} else if (j == 0) {leftMax = arr1[i - 1];} else {leftMax = Math.max(arr1[i - 1], arr2[j - 1]);}if ((m + n) % 2 == 1) {return leftMax;}int rightMin = 0;if (i == m) {rightMin = arr2[j];} else if (j == n) {rightMin = arr1[i];} else {rightMin = Math.min(arr1[i], arr2[j]);}return (leftMax + rightMin) / 2.0;}}return 0;}
}

leetcode

leetcode题目


http://www.ppmy.cn/news/105046.html

相关文章

无线传感网络RNG算法的python仿真实现,WSN作业2

无线传感网络 WSN 课程作业2 RNG算法的原理RNG(Relative Neighborhood Graph,相对邻近图)算法是一种用于构建无线传感器网络中节点之间连接关系的算法。它基于节点之间的相对位置关系来确定它们的邻居关系,而不需要事先知道全局网络拓扑。 第一步,生成节点:首先,根据节…

Vue组件化开发

1. 认识组件 1.1 基础示例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widt…

提速YOLOv7:用MobileNetV3更换骨干网络加速目标检测

目录 前言一、MobileNetV3的介绍1、MobileNetV3的原理和特点2、MobileNetV3的结构二、YOLOv7的介绍1、YOLOv7的结构和流程2、YOLOv7的性能指标三、MobileNetV3替换YOLOv7的骨干网络1、替换骨干网络2、修改neck部分3、微调模型四、实验结果与分析1、数据集和实验设置2、实验结果…

BM1684X-onnx模型转化为bmodel

1&#xff1a;在tpu-mlir目录下进入docker docker run --privileged --name tpu-mlir -v $PWD:/workspace -it sophgo/tpuc_dev:v2.2 原因&#xff1a;该镜像已创建&#xff0c;要么重新创建一个新进程&#xff0c;要么杀死老进程&#xff1b; 解决办法如下&#xff1a; 2:接着…

raw格式照片一键改变风格

为了实现将RAW格式照片一键改变整体风格&#xff0c;且有多种风格选择&#xff0c;我们可以使用神经风格迁移技术。神经风格迁移是一种基于深度学习的方法&#xff0c;可以将一张图像的风格应用到另一张图像上。这里我们将使用Python、rawpy库读取RAW图像&#xff0c;以及torch…

【华为OD机试】分班【2023 B卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 幼儿园两个班的小朋友在排队时混在了一起,每位小朋友都知道自己是否与前面一位小朋友是否同班,请你帮忙把同班的小朋友找出来。 小朋友的编号为整数,与前一位小朋友同班用Y表示,不同…

科技创新盛典:全国科技者工作日激荡创新思维

⭐ 全国科技工作者日的由来⭐ 全国科技工作者日LOGO⭐ 科技工作者界定⭐ 历年主题⭐ 2023年全国科技工作者日 今天我要和大家分享一个令人激动和振奋的消息——全国科技者工作日&#xff01;这是一个特殊的日子&#xff0c;为我们所有投身于科技创新的人们而设立&#xff0c;让…

算法基础学习笔记——⑭欧拉函数\快速幂\扩展欧几里得算法\中国剩余定理

✨博主&#xff1a;命运之光 ✨专栏&#xff1a;算法基础学习 目录 ✨欧拉函数 &#x1f353;求欧拉函数 : &#x1f353;筛法求欧拉函数 : ✨快速幂 ✨扩展欧几里得算法 ✨中国剩余定理 前言&#xff1a;算法学习笔记记录日常分享&#xff0c;需要的看哈O(∩_∩)O&#…