サイズとnums1 mおよびn nums2二順序付けられた配列を与え。
メジアンおよび整然とした配列の両方を検索し、アルゴリズムの時間複雑度はO(ログ(M + N))である必要があります。
あなたは、空とnums2 nums1の両方を想定することはできません
例1:
nums1 = [1, 3]
nums2 = [2]
中央値は2.0である
実施例2:
nums1 = [1, 2]
nums2 = [3, 4]
中央値は、(2 + 3)/ 2 = 2.5であります
溶液:
まず、中央値、二つの状況を見つける:
(1)2つの配列の全体の長さが奇数であると仮定すると、次いでメディアン値である
(2)偶数を仮定は、2つの値の中央値の平均である
。このような奇数の分割の計算であっても長さでなければなりません。我々は、ルールを探索
6位をカウント今5であり、それは二つのアレイ10と長さまでが偶数であると仮定される、5 =(10 + 1)/ 2 6 =(10 + 2)/ 2 ;
二つのアレイ11と長さが奇数であるアップし、次に中央値が第6位置の数、6 =(11 + 1)/ 2 6 =(11 + 2)/ 2であると仮定し、
それがタイトルに変換することができます。 2 /上の平均数(N + 2)のセクション(N + 1)/ 2。
次に、我々は質問にシフト:n番目の大規模な配列は、二つの位置命じた上で評価をします。
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int n = nums1.length + nums2.length;
int a = (n + 1) / 2;
int b = (n + 2) / 2;
search(nums1, nums2, 0, 0, a);
search(nums1, nums2, 0, 0, b);
return (double)(search(nums1, nums2, 0, 0, a) + search(nums1, nums2, 0, 0, b)) / 2;
}
public int search(int[] nums1, int[] nums2, int index1, int index2, int target) {
if (index1 >= nums1.length) {
return nums2[index2 + target - 1];
}
if (index2 >= nums2.length) {
return nums1[index1 + target - 1];
}
if (target == 1) {
return Math.min(nums1[index1], nums2[index2]);
}
int midVal1 = (index1 + target / 2 - 1 < nums1.length) ? nums1[index1 + target / 2 - 1] : Integer.MAX_VALUE;
int midVal2 = (index2 + target / 2 - 1 < nums2.length) ? nums2[index2 + target / 2 - 1] : Integer.MAX_VALUE;
if (midVal1 < midVal2) {
return search(nums1, nums2, index1 + target / 2, index2, target - target / 2);
} else {
return search(nums1, nums2, index1, index2 + target / 2, target - target / 2);
}
}
}