LeetCode题目编号和以前不一致了,编号可能会不对应。回到问题,描述有两个有序的数组,找数组的中位数如2,3,4
,5,6
,中位数为4
;考虑的情况有,数组元素总数为奇数,则相当于排序后的中间位置数,如有(m+n)%2==1
,有mid=(m+n)/2
;如果数组元素总数为偶数,则相当于中间两个数的平均值,如有(m+n)%2==0
,即是(m+n)/2
和(m+n)/2-1
两数字的平均值,用double表示,java默认为double,不用强转。
以下代码题目思路如下:因为是有序的,合并为一个数组,长度m+n
,在按照长度的奇偶判断中位数,算法时间复杂度O(m+n)
,申请3个标记,分别给两个原始数组,以及新数组,比较原始数组大小放入新数组,对应的标记累加,重点注意各个数组长度的边界条件。
int[] arr = new int[nums1.length + nums2.length];
int i = 0, j = 0, k = 0;
while (j < nums1.length && k < nums2.length) {
if (nums1[j] < nums2[k]) {
arr[i] = nums1[j];
i++;
j++;
} else {
arr[i] = nums2[k];
i++;
k++;
}
}
while (j < nums1.length) {
arr[i] = nums1[j];
i++;
j++;
}
while (k < nums2.length) {
arr[i] = nums2[k];
i++;
k++;
}
double mid;
if (arr.length % 2 == 0) {
mid = (arr[arr.length / 2 - 1] + arr[arr.length / 2]) / 2.0;
} else {
mid = arr[arr.length / 2];
}
return mid;
网友评论