力扣 4. 寻找两个正序数组的中位数

2024-01-27 15:48

本文主要是介绍力扣 4. 寻找两个正序数组的中位数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

好久不做题,脑子都木了

题目链接

这道题需要有技巧的二分

首先确认一下中位数的含义:表示在有序数列中处于中间位置的数,于是有两个性质:

  • 位于中位数左右两侧的数应该满足 数量相等 这一要求。
  • LeftMax < RightMin,也就是左侧最大的数要小于右侧最小的数。

现在我们有两个数组 A A A B B B,如果我们在 A A A 数组查找到了第 i i i 个数,那么为了满足 数量相等 条件, B B B 数组中的查找位置 j j j 是可以确定的,也就是 j = m + n + 1 2 − i j=\frac{m+n+1}{2}-i j=2m+n+1i(整数除法)。这里要注意一个点, A A A 必须是较短的那个数组,否则可能 j j j 会出现负数。

现在我们来尝试确定如何进行二分。已知 A [ i − 1 ] < A [ i ] A[i-1]<A[i] A[i1]<A[i], B [ j − 1 ] < B [ j ] B[j-1]<B[j] B[j1]<B[j]

  1. A [ i − 1 ] > B [ j ] A[i-1]>B[j] A[i1]>B[j],则不满足 LeftMax < RightMin,于是 i i i 应该左移,也就是修改右端点
  2. A [ i − 1 ] < B [ j ] A[i-1]<B[j] A[i1]<B[j],则修改左端点
  3. A [ i − 1 ] = B [ j ] A[i-1]=B[j] A[i1]=B[j],可以合并到上面两种情况中去。

最后的答案根据数组的奇偶性分为两种:

  • 若为奇数则答案是 LeftMax
  • 若为偶数则答案是 (LeftMax + RightMin) / 2

class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {if (nums1.length > nums2.length) {return findMedianSortedArrays(nums2, nums1);}int m = nums1.length;int n = nums2.length;int left = 0, right = m;int leftMax = 0, rightMin = 0;while (left <= right) {int i = (left + right) / 2;int j = (m + n + 1) / 2 - i;int nums_im1 = (i == 0 ? Integer.MIN_VALUE : nums1[i - 1]);int nums_i   = (i == m ? Integer.MAX_VALUE : nums1[i]);int nums_jm1 = (j == 0 ? Integer.MIN_VALUE : nums2[j - 1]);int nums_j   = (j == n ? Integer.MAX_VALUE : nums2[j]);if (nums_im1 < nums_j) {leftMax = Math.max(nums_im1, nums_jm1);rightMin = Math.min(nums_i, nums_j);left = i + 1;} else {right = i - 1;}}if ((m + n) % 2 == 0) return (leftMax + rightMin) / 2.0;return leftMax;}
}

这篇关于力扣 4. 寻找两个正序数组的中位数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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

寻找身高相近的小朋友

题目描述: 小明今年升学到小学一年级,来到新班级后发现其他小朋友们身高参差不齐,然后就想基于各小朋友和自己的身高差对他们进行排序,请帮他实现排序。 输入描述: 第一行为正整数H和N,0<H<200,为小明的身高,0<N<50,为新班级其他小朋友个数。第二行为N个正整数H1-HN,分别是其他小朋友的身高,取值范围0<Hi<200(1<=i<=N),且N个正整数各不相同。 输出描述: 输出

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

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

两数之和--力扣1

两数之和 题目思路C++代码 题目 思路 根据题目要求,元素不能重复且不需要排序,我们这里使用哈希表unordered_map。注意题目说了只对应一种答案。 所以我们在循环中,使用目标值减去当前循环的nums[i],得到差值,如果我们在map中能够找到这个差值,就说明存在两个整数的和为目标值。 如果没有找到,就将当前循环的nums[i]以及下标i放入map中,以便后续查

计算数组的斜率,偏移,R2

模拟Excel中的R2的计算。         public bool fnCheckRear_R2(List<double[]> lRear, int iMinRear, int iMaxRear, ref double dR2)         {             bool bResult = true;             int n = 0;             dou

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

PHP7扩展开发之数组处理

前言 这次,我们将演示如何在PHP扩展中如何对数组进行处理。要实现的PHP代码如下: <?phpfunction array_concat ($arr, $prefix) {foreach($arr as $key => $val) {if (isset($prefix[$key]) && is_string($val) && is_string($prefix[$key])) {$arr[