我一上来没读清题,想着这题这么简单,直接就上手写了:

package leetcode.day_12_05;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List; /**
* 给定两个大小分别为 m 和 n 的正序(从小到大)数组nums1 和nums2。请你找出并返回这两个正序数组的 中位数 。
* <p>
* 算法的时间复杂度应该为 O(log (m+n)) 。
* 示例 1:
* <p>
* 输入:nums1 = [1,3], nums2 = [2]
* 输出:2.00000
* 解释:合并数组 = [1,2,3] ,中位数 2
* 示例 2:
* <p>
* 输入:nums1 = [1,2], nums2 = [3,4]
* 输出:2.50000
* 解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
* 示例 3:
* <p>
* 输入:nums1 = [0,0], nums2 = [0,0]
* 输出:0.00000
* 示例 4:
* <p>
* 输入:nums1 = [], nums2 = [1]
* 输出:1.00000
* 示例 5:
* <p>
* 输入:nums1 = [2], nums2 = []
* 输出:2.00000
*
* @author soberw
* @Classname FindMedianSortedArrays0004
* @Description
* @Date 2021-12-05 21:54
*/
public class FindMedianSortedArrays0004 {
/**
* @param array int数组
* @description: 将int数组转换为List<Integer>
* @return: List<Integer>
* @author: soberw
* @time: 2021/12/5 22:10
*/ public List<Integer> listOf(int[] array) {
List<Integer> result = new ArrayList<>();
for (int i : array) {
result.add(i);
}
return result;
} public double findMedianSortedArrays(int[] nums1, int[] nums2) {
double middle = 0.0;
List<Integer> l1 = listOf(nums1);
List<Integer> l2 = listOf(nums2);
l2.addAll(l1);
l2.sort(Comparator.comparingInt(a -> a));
if (l2.size() % 2 == 0) {
middle = ((double) l2.get(l2.size() / 2) + (double) l2.get(l2.size() / 2 - 1)) / 2;
} else {
middle = (double) l2.get(l2.size() / 2);
}
return middle;
}
}


虽然是通过了,但是在我又看一遍题目之后,才发现难点所在。
本题要求时间复杂度控制在O(log(m+n)),而我使用了排序算法就肯定不行了。
因为Arrays.sort时间复杂度是O(nlogn),光是这就超了。
于是我又想出第二种法:

package leetcode.day_12_05;

/**
* @author soberw
* @Classname FindMedianSortedArrays0004
* @Description
* @Date 2021-12-05 21:54
*/
public class FindMedianSortedArrays0004_02 { public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int l1 = nums1.length;
int l2 = nums2.length;
//存放合并后的
int[] num = new int[l1 + l2];
// 第一个数组索引位置
int i = 0;
// 第二个数组索引位置
int j = 0;
// 定义的num数组索引位置
int n = 0; //在数组范围内添加元素致新数组
while (i < l1 && j < l2) {
if (nums1[i] < nums2[j]) {
num[n] = nums1[i++];
} else {
num[n] = nums2[j++];
}
n++;
}
// 若其中一个数组已经添加完毕,接下来只需要添加另一个即可
if (i < l1) {
for (int a = i; a < l1; a++) {
num[n++] = nums1[a];
}
} else {
for (int a = j; a < l2; a++) {
num[n++] = nums2[a];
}
} //返回中值
if (num.length % 2 == 0) {
return ((double) num[num.length / 2] + (double) num[num.length / 2 - 1]) / 2;
} else {
return num[num.length / 2];
}
} public static void main(String[] args) {
int[] nums1 = {1, 3};
int[] nums2 = {2, 5};
System.out.println(new FindMedianSortedArrays0004_02().findMedianSortedArrays(nums1, nums2));
}
}


相比于第一种虽然是快了不少,但是时间复杂度还是不够,这次的是O(m+n)。目前这能在先这样了。
欢迎评论区大神指点。

Leetcode随缘刷题之寻找两个正序数组的中位数的更多相关文章

  1. leetcode-4. 寻找两个正序数组的中位数

    leetcode-4. 寻找两个正序数组的中位数. 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2. 请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(l ...

  2. leetcode 刷题(数组篇)4题 寻找两个正序数组的中位数(二分查找)

    题目描述 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的 中位数 . 示例 1: 输入:nums1 = [1,3], nums2 = ...

  3. leetcode 4. Median of Two Sorted Arrays 寻找两个正序数组的中位数(困难)

    一.题目大意 标签: 查找 https://leetcode.cn/problems/median-of-two-sorted-arrays 给定两个大小分别为 m 和 n 的正序(从小到大)数组 n ...

  4. 微软面试题: LeetCode 4. 寻找两个正序数组的中位数 hard 出现次数:3

    题目描述: 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的中位数. 进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决 ...

  5. 【LeetCode】4. Median of Two Sorted Arrays 寻找两个正序数组的中位数

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:数组,中位数,题解,leetcode, 力扣,python ...

  6. Leetcode4. 寻找两个正序数组的中位数

    > 简洁易懂讲清原理,讲不清你来打我~ 输入两个递增数组,输出中位数![在这里插入图片描述](https://img-blog.csdnimg.cn/25550994642144228e9862 ...

  7. [LeetCode]4.寻找两个正序数组的中位数(Java)

    原题地址: median-of-two-sorted-arrays 题目描述: 示例 1: 输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1, ...

  8. LeetCode-004-寻找两个正序数组的中位数

    寻找两个正序数组的中位数 题目描述:给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的 中位数 . 示例说明请见LeetCode官网. ...

  9. 寻找两个已序数组中的第k大元素

    寻找两个已序数组中的第k大元素 1.问题描述 给定两个数组与,其大小分别为.,假定它们都是已按照增序排序的数组,我们用尽可能快的方法去求两个数组合并后第大的元素,其中,.例如,对于数组,.我们记第大的 ...

随机推荐

  1. 【JAVA今法修真】 第八章 仙道万维网 圣地元宇宙

    您好,我是南橘,万法仙门的掌门,刚刚从九州世界穿越到地球,因为时空乱流的影响导致我的法力全失,现在不得不通过这个平台向广大修真天才们借去力量.你们的每一个点赞,每一个关注都是让我回到九州世界的助力,兄 ...

  2. C# string.Format 和 String.Format 的区别

    string.Format 和 String.Format  ,不论是用法还是意思,都是一样的 怎么使用? 通过 占位符来替换 ,类似于 Replace 的操作 string s = string.F ...

  3. spring boot + mybatis + mybatis逆向工程 --- 心得

    1.前言 以前用惯了springMVC框架 ,以SSM 框架 来开发项目  ,现在因为需要,使用spring boot框架,那么mybatis该如何与spring boot结合呢? 结构区别不大,但是 ...

  4. spring boot & maven 多模块 ---心得

    1.前言 有个名字叫 多模块企业级项目  ,其实就是一个父级maven工程里面有着多个子级maven工程的项目 ,甚至在子级maven 里面还有多个子级maven, 这用到了 maven多模块开发的使 ...

  5. 解决ubuntu 18.04(桌面版)搜狗输入法不能正常使用的问题

    ubuntu下搜狗输入法的配置文件在~/.config目录下,一般有三个目录SogouPY.SogouPY.users.sogou-qimpanel 执行命令 $ cd ~/.config $ rm ...

  6. Linux上天之路(十七)之Shell编程二

    一.shell常用工具 grep 1.作用 Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Exp ...

  7. HDU 1576 A/B (两种解法)

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1576 分析:等式枚举法,由题意可得:, ,代入 ,    得:,把变量 合在一起得: :即满足 为 倍 ...

  8. MySQL提权之启动项提权

    关于MySQL的启动项提权,听其名知其意.就是将一段 VBS脚本导入到  C:\Documents and Settings\All Users\「开始」菜单\程序\启动 下,如果管理员重启了服务器, ...

  9. 【Java】抽象类与抽象方法

    文章目录 抽象类与抽象方法 abstract关键字的使用 abstract修饰类:抽象类 abstract修饰方法:抽象方法 abstract使用上的注意点: 抽象类的匿名子类 模板方法设计模式 抽象 ...

  10. 用js判断页面是否加载完成实现代码

    方式一:window.onload: 当一个文档完全下载到浏览器中时,才会触发window.onload事件.这意味着页面上的全部元素对js而言都是可以操作的,也就是说页面上的所有元素加载完毕才会执行 ...