题目简介
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。
请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
寻找两个有序数组的第k个小值
示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
题目思路
1.因为时间复杂度为O log,用二分法
2.考虑一个数组太短,比索引k还小,中位值就按照顺序在另外一个数组找就可以了。
https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/xun-zhao-liang-ge-you-xu-shu-zu-de-zhong-wei-s-114/
具体程序
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int length1 = nums1.length,length2 = nums2.length;
int totallength = length1+length2;
if(totallength % 2 == 1){
double result = method(nums1,nums2,(totallength+1)/2);
return result;
}else {
double result = (method(nums1,nums2,(totallength)/2) + method(nums1,nums2,(totallength+2)/2))/2.0;
return result;
}
}
public static int method(int[] nums1, int[] nums2, int k) {
int length1 = nums1.length,length2 = nums2.length;
int index1 = 0,index2 = 0;
while (true){
if (index1 == length1){
return nums2[index2 + k - 1];
}
if (index2 == length2){
return nums1[index1 + k -1];
}
if (k == 1){
return Math.min(nums1[index1],nums2[index2]);
}
int half = k / 2;
int newIndex1 = Math.min(index1+half-1,length1-1);
int newIndex2 = Math.min(index2+half-1,length2-1);
int pivot1 = nums1[newIndex1],pivot2 = nums2[newIndex2];
if (pivot1 >= pivot2){
k = k - (newIndex2 + 1 - index2);
index2 = newIndex2 + 1;
}else {
k = k - (newIndex1 + 1 - index1);
index1 = newIndex1 + 1;
}
}
}
}