JavaScript学习笔记
题目要求
给定两个大小为 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 |
– | – |
提示 | nums1.length == m nums2.length == n 0 <= m <= 1000 0 <= n <= 1000 1 <= m + n <= 2000 -106 <= nums1[i], nums2[i] <= 106 |
JavaScript代码
var findMedianSortedArrays = function(nums1, nums2) {
let nums1Length = nums1.length;
let nums2Length = nums2.length;
let newNums = new Array();
if (nums1Length == 0 && nums2Length == 0) {
return 0;
} else if (nums1Length != 0 && nums2Length == 0) {
if (nums1Length == 1) {
return nums1[0];
}
newNums = nums1;
} else if (nums2Length != 0 && nums1Length == 0) {
if (nums2Length == 1) {
return nums2[0];
}
newNums = nums2;
}
if (newNums.length == 0) {
let i1 = nums1Length - 1;
let i2 = nums2Length - 1;
if ((nums1Length + nums2Length) % 2 == 0) {
while (newNums.length < ((nums1Length + nums2Length) / 2 + 1)) {
if (i1 == -1) {
newNums.push(nums2[i2]);
i2--;
continue;
}
if (i2 == -1) {
newNums.push(nums1[i1]);
i1--;
continue;
}
if(nums1[i1] > nums2[i2]) {
newNums.push(nums1[i1]);
i1--;
} else if (nums1[i1] < nums2[i2]) {
newNums.push(nums2[i2]);
i2--;
} else if (nums1[i1] == nums2[i2]) {
newNums.push(nums1[i1]);
i1--;
if (newNums.length == ((nums1Length + nums2Length) / 2 + 1)) {
break;
}
newNums.push(nums2[i2]);
i2--;
}
}
} else {
while (newNums.length < ((nums1Length + nums2Length + 1) / 2)) {
if (i1 == -1) {
newNums.push(nums2[i2]);
i2--;
continue;
}
if (i2 == -1) {
newNums.push(nums1[i1]);
i1--;
continue;
}
if(nums1[i1] > nums2[i2]) {
newNums.push(nums1[i1]);
i1--;
} else if (nums1[i1] < nums2[i2]) {
newNums.push(nums2[i2]);
i2--;
} else {
newNums.push(nums1[i1]);
i1--;
if (newNums.length == ((nums1Length + nums2Length + 1) / 2)) {
break;
}
newNums.push(nums2[i2]);
i2--;
}
}
}
} else {
if ((nums1Length + nums2Length) % 2 == 0) {
let middleNum1 = newNums[newNums.length / 2 - 1];
let middleNum2 = newNums[newNums.length / 2];
return (middleNum1 + middleNum2) / 2;
} else {
return newNums[(newNums.length - 1) / 2];
}
}
if ((nums1Length + nums2Length) % 2 == 0) {
let middleNum1 = newNums.pop();
let middleNum2 = newNums.pop();
return (middleNum1 + middleNum2) / 2;
} else {
return newNums.pop();
}
};
解题思路
- 新建一个数组newNums用于存放对两个数组nums1和nums2进行重排序后的数值;
- newNums的长度大于nums1和nums2长度之和的一半时,即可得到能够求得的中位数的数值;
- 根据nums1和nums2长度之和的奇偶性对newNums进行pop()操作,并返回运算结果。