Day 4
以下题目直接来源于LeetCode
There are two sorted arrays nums1 and nums2 of size m and n respectively.
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
Example 1:
nums1 = [1, 3] nums2 = [2] The median is 2.0
Example 2:
nums1 = [1, 2] nums2 = [3, 4] The median is (2 + 3)/2 = 2.5
思路:
LeetCode上的答案我有点看不太懂 :<
我自己的想法是觉得这个有点像mergesort里merge的那个步骤,但是因为它有时间复杂度的限制,所以我的想法是就不能merge完,而是merge到了中位数的时候就从循环中break,就能尽量避免O(n)的时间复杂度了。
java代码如下:
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
//calculate the length of array nums1 and nums2
int length1 = nums1.length;
int length2 = nums2.length;
int length = length1 + length2;
int[] sorted = new int[length];
double median = 0.0;
//to calculate median, we need two indexes
int index01 = (int) Math.floor(length / 2) - 1;
int index02 = index01 + 1;
int m1 = 0, m2 = 0;
//iterate through two arrays to find the number at index01 and index02
int i = 0, j = 0, k = 0;
while (true) {
if (length % 2 == 0) {
if ((k - 1) == index01) {
m1 = sorted[k - 1];
} else if ((k - 1) == index02) {
m2 = sorted[k - 1];
median = (m1 + m2) / 2.0;
break;
}
} else {
if ((k - 1) == index02) {
median = sorted[k - 1];
break;
}
}
if (i == length1 && j < length2) {
sorted[k] = nums2[j];
j += 1;
k += 1;
} else if (j == length2 && i < length1) {
sorted[k] = nums1[i];
i += 1;
k += 1;
} else if (i < length1 && j < length2) {
if (nums1[i] <= nums2[j]) {
sorted[k] = nums1[i];
i += 1;
k += 1;
} else {
sorted[k] = nums2[j];
j += 1;
k += 1;
}
}
}
return median;
}