一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情。
寻找两个正序数组的中位数
题目如下图所示,也可以在LeetCode题目中找到此题。
题目解析
根据题目描述,寻找两个正序数组的中位数,注意,是两个正序数组。
也就是说是两个正序数组组合后的中位数。
题目提供素材
题目提供了以下素材:
- 两个正序数组,数组长度处于0到1000之间,可能为0。
我的解读
要想获得两个正序数组组合后的中位数,那必然要做两件事。
-
将两个正序数组组合成一个有序数组。
-
将组合后的有序数组取出对应的中位数。
解题思路
解题思路其实有很多种,有朋友也做了这道题,我发现他是用Java中的集合做的,将两个数组所有的元素放到一个集合里面。
通过Collection.sort方法来进行排序,或者使用Arrays中的排序方法。
执行结果比较糟糕,虽然执行通过了,但是执行速度和内存都没有什么节约。
显然这个方法不太可行,如果是高强度的调用,那将对服务器会是一个很大的压力。
所以我的思路是不同的,一开始的想法是将一个数组塞进到另外一个数组中,转念一想不对,数组的长度有所限制。
只能弄一个新数组了,下面分步骤来说一下我的思路:
-
因为两个数组都是正序,先要判断第一个值先选择哪个数组中的。
-
然后声明三个变量,分别代表着数组1的下标索引,数组2的下标索引,结果数组的下标索引。
-
通过循环的方式,对两个数组不断取值,再通过判断两个数组的值进行赋值。
代码
看一下具体代码吧。
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int[] result = new int[nums1.length + nums2.length];
if(result.length == 0){
return 0.0;
}else if(nums1.length == 0){
result = nums2;
}else if(nums2.length == 0){
result = nums1;
}else{
boolean is1 = nums1[0] < nums2[0];
int num1 = 0;
int num2 = 0;
int resultIndex = 0;
while(true){
if(resultIndex == result.length){
break;
}
if(is1){
result[resultIndex] = nums1[num1];
resultIndex++;
num1++;
if(num2 > nums2.length - 1){
continue;
}else if(num1 > nums1.length - 1 || nums1[num1] > nums2[num2]){
is1 = false;
}
}else{
result[resultIndex] = nums2[num2];
resultIndex++;
num2++;
if(num1 > nums1.length - 1){
continue;
}else if(num2 > nums2.length - 1 || nums2[num2] > nums1[num1]){
is1 = true;
}
}
}
}
if(result.length % 2 != 0){
return (result[result.length / 2]);
}else{
int s1 = result.length / 2;
int s2 = result.length / 2 -1;
return (result[s1] + result[s2]) / 2.0;
}
}
}
执行结果
临近下班,刷了一道题。