从0打卡leetcode之day 5 ---两个排序数组的中位数
前言
我靠,才坚持了四天,就差点不想坚持了。不行啊,我得把leetcode上的题给刷完,不然怕是不好进入bat的大门。
题目描述
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。
请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。你可以假设 nums1 和 nums2 均不为空。
示例
nums1 = [1, 3]
nums2 = [2]
中位数是 2.0
nums1 = [1, 2]
nums2 = [3, 4]
中位数是 (2 + 3)/2 = 2.5``
解题
最简单粗暴的就是把这两个数组头尾连接起来,然后重新给他们排序一下,冒泡排序相信你信手拈来,当然,你也可以装逼用快速排序。
但是,如果这样子做的话,题目给你的有序数组就没啥用了,和无序一个样,所以这样做是不行的。题目要求是时间复杂度不能超过O(log(n+m)),说实话,这个复杂度我是不知道怎么做好,我的做法时间复杂度是O(n+m)。
具体是这样的
居然两个数组都是有序的了,我们可以再弄一个中间数组,然后把两个数组各自从数组头开始比较,哪个元素小,我们就把它存在中间数组。然后接下下一个元素一直比较下去。
我还是直接上代码吧。如下:
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int m = nums1.length;
int n = nums2.length;
int t = m + n;//总长度
int temp[] = new int[t];
int i = 0, j = 0, k = 0;
double obj;//用来存目标值
while(i < m && j < n){
//把数组中比较小的值转移到temp数组中
if(nums1[i] < nums2[j]){
temp[k++] = nums1[i++];
}else{
temp[k++] = nums2[j++];
}
}
//把剩余的转移过去
while (i < m){
temp[k++] = nums1[i++];
}
while(j < n){
temp[k++] = nums2[j++];
}
//两个数组的总个数是奇数还是偶数
if(t % 2 == 0){//偶数
obj = (temp[t/2] + temp[(t-1)/2]) / 2.0;
}else{
obj = temp[t/2];
}
return obj;
}
虽然时间复杂度是O(n+m),但是提交的时候居然通过了,而且还打败了93%的人。
不过,这里还可以在优化,把时间复杂度降低到O((n+m)/2)。
就是说其实我们不用给整个temp数组排序,我们只要求出前面一半的数组元素就可以知道中间那个元素了,。例如不管一共是偶数个元素还是奇数个元素,我们让temp存到下标为t/2就可以了。然后再来判断t是奇数还是偶数…..
例如上面两个示例,示例1一共有三个元素,那么temp[t/2]=temp[1]=2。然后直接把temp[t/2]=temp[1]取出来返回就可以了。
示例2一共有4个元素,那么temp[t/2]=temp[2]=3。由于是偶数,我们直接把temp[t/2]=3和temp[t/2-1]=2这两个元素取出来处理之后返回就可以了。
至于代码这么写,我就不写了。知道有这么一回事就可以了。
如果你坚持想要O(log(n+m))的时间复杂度,那么可以看官方给的答案:
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/
完
从0打卡leetcode之day 5 ---两个排序数组的中位数的更多相关文章
- LeetCode刷题-004两个排序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 示例 1:nums1 = [1, 3]num ...
- Leetcode(4)-两个排序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 示例 1: nums1 = [1, 3] ...
- LeetCode(4):两个排序数组的中位数
Hard! 题目描述: 有两个大小为 m 和 n 的排序数组 nums1 和 nums2 . 请找出两个排序数组的中位数并且总的运行时间复杂度为 O(log (m+n)) . 示例 1: nums1 ...
- LeetCode 4 - 两个排序数组的中位数 - [分治]
题目链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/description/ 给定两个大小为 m 和 n 的有序数组 n ...
- LeetCode#5 两个排序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 你可以假设 nums1 和 nums2 ...
- LeetCode Golang 4. 寻找两个有序数组的中位数
4. 寻找两个有序数组的中位数 很明显我偷了懒, 没有给出正确的算法,因为官方的解法需要时间仔细看一下... func findMedianSortedArrays(nums1 []int, nums ...
- leetcode题目4.寻找两个有序数组的中位数(困难)
题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 ...
- leetcode python两个排序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 你可以假设 nums1 和 nums2 不同 ...
- 【LeetCode】4. 寻找两个有序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...
随机推荐
- 本机是wifi,虚拟机无法连接外网问题
1.首先看自己本机的各网口是否都启动. 2.在虚拟机中的虚拟网络编辑器中,选择桥接模式,并选择对应第一步的WLAN端口. 3.在虚拟机设置中选择自定义,选择第二部中选的VMnet2即可上网了.
- Java 博客导航
Java 博客导航 一.基础知识 Java 基础知识 Java 常用知识点 Java 多线程 Java 正则使用 Java IO Java 集合
- DWM1000 Blink结构 -- 帧过滤第一节
DWM1000 帧结构分析主要学习DWM1000 帧过滤功能,希望在目前DS-TWR定位系统中增加中断和帧过滤功能,帧过滤功能可以有效减少系统中的各个模块同时收发数据时的干扰问题,从而极大的提供系统稳 ...
- 心得体会,搞清楚你为什么学习C++?
小编作为一名初学者时,从来没问过自己学习C语言.C++等语言是为了什么? 一开始,接触到这个行业可以说是有种魔力引导我,感到了很大的兴趣,很有意思. 我试着读资料,报名学习,找资料,可算是功夫不负有心 ...
- margin与padding的bug
1.在页面布局时,值对于块元素来说,相邻的两个兄弟块元素间的margin-top与上一个兄弟的margin-bottom重合时, 解决办法:对其中一个块元素中设置 display:inline- ...
- input框中修改placeholder的样式
有时间input标签的placeholder属性会出现问题,下面是修改placeholder的样式demo input::-webkit-input-placeholder{ color:red; f ...
- Could not load file or assembly 'System.Web.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'
提示哪个引用修改哪个引用的属性: Could not load file or assembly 'System.Web.Http, Version=4.0.0.0, Culture=neutral, ...
- JPG、PNG、GIF、SVG 等格式图片区别
1.图片 2. 前言 首先,我们要清楚的是,图片从类型上分,可以分为 位图 和 矢量图. 位图:位图又叫点阵图或像素图,计算机屏幕上的图是由屏幕上的发光点(即像素)构成的,每个点用二进制数据来描述其颜 ...
- android中进度条的实现
布局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:androi ...
- 手机touch事件及参数【转】(自己懒得写了,找了一篇摘过来)
[html5构建触屏网站]之touch事件 前言 一个触屏网站到底和传统的pc端网站有什么区别呢,交互方式的改变首当其冲.例如我们常用的click事件,在触屏设备下是如此无力. 手机上的大部分交互都是 ...