leetCode-第四题求两个数组的中位数
两数组中的中位数
原题链接: 两数组的中位数
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
示例 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
示例 4:
输入:nums1 = [], nums2 = [1]
输出:1.00000
示例 5:
输入:nums1 = [2], nums2 = []
输出:2.00000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
合并数组并进行排序,但是这样算法复杂度就不符合题目中的要求了,因此在C++实现的时候结合了二分查找的方法进行实现;
go解题:
package mainimport ("fmt""sort"
)/*
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2*/func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {numsSet := make([]int, 0, 6)numsSet = append(numsSet, nums1...)numsSet = append(numsSet, nums2...)sort.Ints(numsSet)numsLen := len(numsSet)if numsLen == 0 {return 0.0000}fmt.Println(numsSet)if numsLen%2 == 0 {return (float64(numsSet[numsLen/2-1]) + float64(numsSet[numsLen/2])) / 2} else {return float64(numsSet[numsLen/2])}
}func main() {nums1 := []int{1, 2}nums2 := []int{3, 4}median := findMedianSortedArrays(nums1, nums2)fmt.Println(median)
}
解题思路
如下数组:
我们需要想办法找到一条线能将两个数组按照左变小右边大的方式分开,那么在取中位数的时候就能根据线所在的情况取出两个数组中的中位数
C++代码按照二分查找方式实现的代码:
//
// Created by andrew on 2021/3/7.
//
#include <iostream>
#include <vector>using namespace std;class Solution {public:static double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {size_t len1 = 0, len2 = 0;len1 = nums1.size();len2 = nums2.size();size_t sumLen = len1 + len2;int i = 0, j = 0;bool dataStatus = false;int data1 = 0, data2 = 0, data3 = 0;if (sumLen % 2 == 0) {dataStatus = true;}for (i = 0, j = 0; i + j <= sumLen / 2;) {if (i >= len1) {data3 = data2;data2 = data1;data1 = nums2[j];j++;continue;}if (j >= len2) {data3 = data2;data2 = data1;data1 = nums1[i];i++;continue;}if (nums1[i] >= nums2[j]) {data3 = data2;data2 = data1;data1 = nums2[j];j++;} else {data3 = data2;data2 = data1;data1 = nums1[i];i++;}}if (dataStatus) {return ((double) data2 + (double) data1) / 2;} elsereturn (double) data1;}
};int main(int argc, char *argv[]) {vector<int> nums1 = {1};vector<int> nums2 = {2,3, 4};cout << Solution::findMedianSortedArrays(nums1, nums2) << endl;return 0;
}
实际执行结果可以看出,使用该方法在时间点相同的情况下,官方32ms 自己的代码执行需要24ms,比官方代码快8ms左右
leetCode-第四题求两个数组的中位数相关推荐
- return两个返回值_LeetCode 第四题 寻找两个有序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...
- 最快速度求两个数组之交集算法与hash
一个题目 该题目来自58同城的二面,用最快速度求两个数组之交集算法. 比如A={6,2,4,1},B={2,9,4,3},那么A&B={2,4}. 算法一:在大多数情况,也就是一般的情况下,大 ...
- 最快速度求两个数组之交集算法
该题目来自58同城的二面,用最快速度求两个数组之交集算法. 比如A={6,2,4,1},B={2,9,4,3},那么A&B={2,4}. 算法一:在大多数情况,也就是一般的情况下,大家都能想出 ...
- 【leetcode】 算法题1 两数之和
[leetcode] 算法题1 两数之和 问题 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums ...
- leetcode 第1题【两数之和】C语言
leetcode 第1题[两数之和] 今天开始刷 leetcode 了,坚持每天做 因为不太会编程,只是想记录下来,若有错误,欢迎指正. /*** Note: The returned array m ...
- 使用Set求两个数组的并集|| 交集||差集
这里要讲解一下,使用Set求两个数组的并集|| 交集||差集. 先定义两个数组: let a = new Set([1, 2, 3]);let b = new Set([4, 3, 2]); 并集 l ...
- Java求两个数组的交集、差集、并集
目录 Java求两个数组的并集,代码如下: Java求两个数组的交集,代码如下: Java求两个数组的差集,代码如下: 交集.差集.并集测试代码如下: Java求两个数组的并集,代码如下: /*** ...
- PHP实现求两个数组的并集
$thiscates = explode(",", $iddata['cates']) ; $getcates = $_GPC['cates']; $allcates = arra ...
- 求两个数组的交集和并集
晚上闲来无事,想起前两天查资料时候,看到别人一篇博客标题关于数组的交集和并集,晚上也随便写写,权当督促自己坚持经常练习练习写写小Demo.如下,先来一段求有序数组的交集的代码,代码如下: public ...
最新文章
- 计图MPI分布式多卡
- linux oracle查询乱码问题,Linux环境Oracle显示乱码的解决方法
- ubuntu运行Faster R-CNN
- mysql空密码php_WAMP中如何修改mysql默认空密码_MySQL
- AT32F415 USART1、2、3,DMA 用结构体统一配置收发
- make menuconfig选择m编译为驱动模块
- android多个水波球,android球形水波百分比控件代码
- Linux基础学习八:mysql主从复制原理以及详细搭建步骤
- Web.config中创建自定义配置节
- Android 系统(73)---Android判断你的应用在前台还是在后台
- 前端人员必须掌握哪些技术?常见缓存种类有什么?
- NLP实战 | BERT文本分类及其魔改(附代码)
- 2345蓝月传奇服务器维护,2345蓝月传奇4月29日合服公告
- LNK1181	无法打开输入文件“winmm.lib”
- 群晖黑科技docker套件_群晖Docker玩法
- Comparable
- SQL Server使用SUM(求和)函数
- 树上战争 HDU-2545
- 推荐4款非常实用的电脑软件
- 地图的电子围栏功能的技术选型