我来实现一下一楼我说的方法吧,首先解决一个数组找中位数的问题
对于 len % 2 == 0,我们求出数组第 len / 2 大的数和 len / 2 + 1 大的数,再求和除以 2 就是中位数,对于 len % 2 == 1 的情况,直接找 len / 2 + 1 大的数就是中位数。
至于怎么求第 k 大的数( top 问题),可以用快排的分区函数来实现。
https://www.geeksforgeeks.org/kth-smallestlargest-element-unsorted-array/以下代码通过了 leetcode judege:
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int[] cpy = new int[nums1.length + nums2.length];
System.arraycopy(nums1, 0, cpy, 0, nums1.length);
System.arraycopy(nums2, 0, cpy, nums1.length, nums2.length);
return findForOne(cpy);
}
double findForOne(int[] nums) {
if (nums.length % 2 == 0) {
int k1 = getKth(nums, 0, nums.length - 1, nums.length / 2);
int k2 = getKth(nums, 0, nums.length - 1, nums.length / 2 + 1);
return (k1 + k2) / 2.0;
}
return getKth(nums, 0, nums.length - 1, nums.length / 2 + 1);
}
int getKth(int[] nums, int lo, int hi, int k) {
int ans = Integer.MAX_VALUE;
if (k > 0 && k <= hi - lo + 1) {
int pos = partition(nums, lo, hi);
int len = pos - lo;
if (len == k - 1)
ans = nums[pos];
else if (k - 1 < len)
ans = getKth(nums, lo, pos - 1, k);
else
ans = getKth(nums, pos + 1, hi, k - len - 1);
}
return ans;
}
int partition(int arr[], int l, int r) {
int x = arr[r], i = l;
for (int j = l; j <= r - 1; j++) {
if (arr[j] <= x) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
}
}
int tmp = arr[i];
arr[i] = arr[r];
arr[r] = tmp;
return i;
}
}