数组-在两个长度相等的有序数组中找到上中位数

2024-05-25 19:04

本文主要是介绍数组-在两个长度相等的有序数组中找到上中位数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

解题思路

此题目直接遍历两个列表,时间复杂度为O(n);使用二分法去比较两个递增列表的中位数,缩小两个数组中位数范围,时间复杂度O(logn),这里我们的算法实现使用二分法。

通过举例子来说明解题算法:

在循环过程中,每时每刻都保持两个比较列表的长度是相等的

1.当两个列表 [low1,high1] [low2,high2] 的中位数相等时:

        [1,3,4,5]和[2,3,5,6]=[1,2,3,3,4,5,5,6]

        [1,4,5,6,7]和[2,3,5,7,8]=[1,2,3,4,5,5,6,7,7,8]

可以看到,无论(high1-low1+1)是奇数还是偶数,当arr[mid]相等时,上中位数就是arr[mid]

2.当两个列表 [low1,high1] [low2,high2] 的中位数arr1[mid1]<arr2[mid2]时:

        当(high1-low1+1)是奇数时:[1,2,4,8,9] 和 [2,3,5,7,9]  low1=mid1;high2 = mid2;

        当(high1-low1+1)是偶数时:[1,2,4,8] 和 [2,3,4,7]        low1=mid1+1;high2 = mid2;

        缩小范围到黄色加粗内。

3.当两个列表 [low1,high1] [low2,high2] 的中位数arr1[mid1]>arr2[mid2]时:

        当(high1-low1+1)是奇数时:[1,5,7,8,9] 和 [2,3,5,7,9]  low2=mid2;high1 = mid1;

        当(high1-low1+1)是偶数时:[1,5,7,8] 和 [2,3,4,7]        low2=mid2+1;high1 = mid1;

        缩小范围到黄色加粗内。

4.最后返回arr1[low1]和arr2[low2]中的较小者。

代码实现

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** find median in two sorted array* @param arr1 int整型一维数组 the array1* @param arr2 int整型一维数组 the array2* @return int整型*///这里直接遍历两个列表,时间复杂度为O(n)//使用二分法去比较两个递增列表的中位数,缩小两个数组中位数范围,时间复杂度O(logn)public int findMedianinTwoSortedAray (int[] arr1, int[] arr2) {// 这里使用二分法int res = 0;int low1 = 0, high1 = arr1.length - 1;int low2 = 0, high2 = arr2.length - 1;while (low1 < high1) {int mid1 = (low1 + high1) / 2;int mid2 = (low2 + high2) / 2;if (arr1[mid1] == arr2[mid2]) {//这个不管是奇数还是偶数都成立://[1,3,4,5]和[2,3,5,6]=[1,2,3,3,4,5,5,6]//[1,4,5,6,7]和[2,3,5,7,8]=[1,2,3,4,5,5,6,7,7,8]low1 = mid1;low2 = mid2;break;} else if (arr1[mid1] < arr2[mid2]) {if ((high1 - low1 + 1) % 2 == 1) { //如果high1-low1+1为奇数//比如[1,2,4,8,9]和[2,3,5,7,9]low1 = mid1;high2 = mid2;} else { //如果high1-low1+1为偶数//比如[1,2,4,8]和[2,3,4,7]low1 = mid1 + 1;high2 = mid2;}} else {if ((high1 - low1 + 1) % 2 == 1) { //如果high1-low1+1为奇数//比如[1,5,7,8,9]和[2,3,5,7,9]low2 = mid2;high1 = mid1;} else { //如果high1-low1+1为偶数//比如[1,5,7,8]和[2,3,4,7]high1 = mid1;low2 = mid2 + 1;}}}res = arr1[low1] < arr2[low2] ? arr1[low1] : arr2[low2];return res;}
}

刷题链接

在两个长度相等的排序数组中找到上中位数_牛客题霸_牛客网

这篇关于数组-在两个长度相等的有序数组中找到上中位数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1002361

相关文章

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

基于Redis有序集合实现滑动窗口限流的步骤

《基于Redis有序集合实现滑动窗口限流的步骤》滑动窗口算法是一种基于时间窗口的限流算法,通过动态地滑动窗口,可以动态调整限流的速率,Redis有序集合可以用来实现滑动窗口限流,本文介绍基于Redis... 滑动窗口算法是一种基于时间窗口的限流算法,它将时间划分为若干个固定大小的窗口,每个窗口内记录了该时间

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou