前言
美好的一天从刷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-cn.com/problems/me…. 寻找两个正序数组的中位数)
解题思路
莽夫解法
初识题目 得题法:
1. 将两个数组进行合并 在进行排序(从小到大)
2. 根据得到得新的正序数组 利用数学求中位数的方法求得
3. 中位数求解方法: (num.length+1)为偶数 中位数为 num[(num.length+1)/2]
(num.length+1)为奇数
中位数为 (num[((num.length+1)/2)]+num[((num.length+1)/2+1)])/2
AC代码
var b = function(nums1, nums2) {
var num = nums2.concat(nums1)
num = num.sort((a, b) => a - b)
if((num.length+1)%2 == 0) {
return num[(num.length+1)/2-1]
}else {
let num1 = parseInt((num.length+1)/2)
let middleNum = parseFloat((parseInt(num[num1]) + parseInt(num[num1-1]))/2)
return middleNum
}
};
虽然解决了 但是看数据才击败了9%得人 有点low啊!
"诸葛"解法
[缺陷] 莽夫解法中 未使用到两个数组为 【正序数组】
再审题目 得新法 :
1. 利用数学中位数求解方式 可得(当一个正序数组的长度为 len时,
len为奇数 要找到(len+1)/2这个元素
len为偶数 要找到(len+1)/2 和 (len+1)/2+1 这两个元素
2. 找到两个数组中 第k个大小的数
- 首先两个数组得同时进行查找 找第k个元素, 第一个数组找0 到 k/2 的元素。第二个数组找0 到 k/2 的元素, 两个数组的num【k/2】,进行比较。那个小就舍掉 0 到 k/2 的元素
- 然后又是进行重复 一个数组为满数组s1 另一个为舍弃数组s2 再进行找是s1 和 s2的中位数。 到了临界条件就停止循环
- 临界条件: 如果一个数组为空,说明该数组中的所有元素都被排除,我们可以直接返回另一个数组中第 k小的元素。 如果 k=1,我们只要返回两个数组首元素的最小值即可。
AC代码
// 找到第 k 个 元素
var findK = function(nums1,nums2,k) {
var index1 = 0;
var index2 = 0;
let num1 = nums1.length;
let num2 = nums2.length;
var flag = -1;
while(flag == -1) {
if(index1 == nums1.length) {
flag = 1;
return nums2[index2-1+k]
}
if(index2 == nums2.length) {
flag = 1;
return nums1[index1-1+k]
}
if(k == 1) {
flag = 1;
return Math.min(nums1[index1],nums2[index2]);
}
half = parseInt(k/2);
let newindex1 = Math.min((index1 + half),num1) - 1;
let newindex2 = Math.min((index2 + half),num2) - 1;
let value1 = nums1[newindex1];
let value2 = nums2[newindex2];
if(value1 <= value2) {
k = k - (newindex1 - index1 + 1)
index1 = newindex1 + 1;
}else {
k = k - (newindex2 - index2 + 1)
index2 = newindex2 + 1;
}
}
}
var findMedianSortedArrays = function(nums1, nums2) {
// 判断两个数组的长度之和是否为偶数
let elmentK = parseInt( (nums1.length + nums2.length + 1) / 2)
if((nums1.length+ nums2.length)%2 == 0){
return parseFloat((findK(nums1,nums2,elmentK) + findK(nums1,nums2,elmentK+1))/2)
}else {
return parseFloat(findK(nums1,nums2,elmentK));
}
}
总结
有时候想出一种解法,但不一定是最优的。只有虚心学习,才能更强。
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情