数组--寻找中位数
2020-01-06 本文已影响0人
暮想sun
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
例:nums1 = [1, 2] nums2 = [3, 4]
思路:从左右分别开始进行比较,如果两个数组中其中一个比较完毕。直接将另一个数组的元素赋值给新数组
public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
//nums1为空
if (nums1.length == 0) {
return findMedianSortedArrays(nums2);
}
//nums2为空
if (nums2.length == 0) {
return findMedianSortedArrays(nums1);
}
//都不为空
int[] nums = new int[nums1.length + nums2.length];
//定义左右数组下标
int left = 0;
int right = nums.length - 1;
//定义第一第二数组开始和结束标志
int firstNumLeft = 0, secondNumLeft = 0, firstNumRight = nums1.length - 1, secondNumRight = nums2.length - 1;
while (firstNumLeft <= firstNumRight && secondNumLeft <= secondNumRight) {
if (nums1[firstNumLeft] <= nums2[secondNumLeft]) {
nums[left++] = nums1[firstNumLeft++];
} else {
nums[left++] = nums2[secondNumLeft++];
}
if (nums1[firstNumRight] >= nums2[secondNumRight]) {
nums[right--] = nums1[firstNumRight--];
} else {
nums[right--] = nums2[secondNumRight--];
}
}
//第一个数组仍存在数据
while (firstNumLeft <= firstNumRight) {
nums[left++] = nums1[firstNumLeft++];
}
//第二个数组仍存在数据
while (secondNumLeft <= secondNumRight) {
nums[left++] = nums2[secondNumLeft++];
}
return findMedianSortedArrays(nums);
}
public static double findMedianSortedArrays(int[] nums) {
//偶数时返回中间两数相加/2,奇数时返回中间数
int mid = nums.length / 2;
if (nums.length % 2 == 0) {
return (double)(nums[mid] + nums[mid - 1]) / 2;
}
return (double)nums[mid];
}