首页 技术 正文
技术 2022年11月17日
0 收藏 573 点赞 3,537 浏览 1856 个字

原题地址: median-of-two-sorted-arrays

题目描述:

示例 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

示例 3:

输入:nums1 = [0,0], nums2 = [0,0]

输出:0.00000

提示:

nums1.length == m

nums2.length == n

0 <= m <= 1000

0 <= n <= 1000

1 <= m + n <= 2000

-106 <= nums1[i], nums2[i] <= 106

进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?

解答方法:

1.nums1,nums2合并后排序

时间复杂度:遍历全部数组 O(m+n)

空间复杂度:开辟了一个数组,保存合并后的两个数组 O(m+n)

class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int[] res=new int[nums1.length + nums2.length];
int n = 0;
int len = nums1.length + nums2.length;
for (int i = 0; i < nums1.length; i++){
res[i] = nums1[i];
}
for (int i = nums1.length; i < res.length; i++){
res[i] = nums2[n];
n++;
}
Arrays.sort(res);
if(len % 2 == 0){
return (double)(res[len/2] + res[len/2 - 1])/2;
}else{
return res[len/2];
}
}
}

问题:

  • 拷贝产生新的数组从而增加时间复杂度,而题目限制了时间复杂度为 O(log (m+n)),没达到要求。

2.二分法

用到二分的方法才能达到 O(log(m+n))

分别找第 (m+n+1) / 2 个,和 (m+n+2) / 2 个,然后求其平均值即可,对奇偶数均适用。

由于数列是有序的,其实我们完全可以一半儿一半儿的排除。假设我们要找第 k 小数,我们可以每次循环排除掉 k/2 个数。

public double findMedianSortedArrays(int[] nums1, int[] nums2) {

int n = nums1.length;

int m = nums2.length;

int left = (n + m + 1) / 2;

int right = (n + m + 2) / 2;

//将偶数和奇数的情况合并,如果是奇数,会求两次同样的 k 。

return (getKth(nums1, 0, n – 1, nums2, 0, m – 1, left) + getKth(nums1, 0, n – 1, nums2, 0, m – 1, right)) * 0.5;

}

private int getKth(int[] nums1, int start1, int end1, int[] nums2, int start2, int end2, int k) {
int len1 = end1 - start1 + 1;
int len2 = end2 - start2 + 1;
//让 len1 的长度小于 len2,这样就能保证如果有数组空了,一定是 len1
if (len1 > len2) return getKth(nums2, start2, end2, nums1, start1, end1, k);
if (len1 == 0) return nums2[start2 + k - 1]; if (k == 1) return Math.min(nums1[start1], nums2[start2]); int i = start1 + Math.min(len1, k / 2) - 1;
int j = start2 + Math.min(len2, k / 2) - 1; if (nums1[i] > nums2[j]) {
return getKth(nums1, start1, end1, nums2, j + 1, end2, k - (j - start2 + 1));
}
else {
return getKth(nums1, i + 1, end1, nums2, start2, end2, k - (i - start1 + 1));
}
}

题解出处:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-w-2/

上一篇: Aselenium前言
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,085
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,560
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,409
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,182
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,819
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,902