两数组中的中位数
原题链接: 两数组的中位数
给定两个大小分别为 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 main
import (
"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;
} else
return (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左右