令人頭禿的困難題 僅寫(xiě)我的部分理解,詳見(jiàn)學(xué)習(xí)題解鏈接。
1、變量解釋
LMax :切割點(diǎn)左側(cè)最大元素
RMin :切割點(diǎn)右側(cè)最小元素
cut :中位數(shù)的切割點(diǎn) eg:[1,2,3] LMax=RMin=2 ? [1,2] LMax=1 RMin=2
2、中位數(shù) 中位數(shù)切點(diǎn)滿(mǎn)足的條件有:(LMax1<=RMin2)&&(LMax2<=RMin1)&&(cut1 cut2==len1 len2)  其中cut1 cut2==len1 len2 (最終的切點(diǎn)下標(biāo)是len1 len2,實(shí)際對(duì)應(yīng)位置是len1 len2 1),因?yàn)樘摂M加后的數(shù)組長(zhǎng)度和為2len1 2len2 2 。 結(jié)果為result=(max(LMax1,LMax2) min(RMin1,RMin2))/2.0
3、虛擬數(shù)組 由于求中位數(shù)存在奇數(shù)偶數(shù)的問(wèn)題,我們虛擬的在數(shù)字之間加上一個(gè)# .
2n 1 永遠(yuǎn)都是奇數(shù),eg:1 2 3 變成 #1#2#3# 這樣就可以保證下式成立
LMaxi = (Ci-1)/2 位置上的元素
RMini = Ci/2 位置上的元素 在實(shí)際的計(jì)算中,沒(méi)有人真的在數(shù)字之間加入# ,只是在計(jì)算時(shí)先乘以2,按照下標(biāo)取數(shù)時(shí)再除以2.
4、如果一個(gè)數(shù)組完全小于等于另一個(gè)?
C1 = 0 —— 數(shù)組1整體都在右邊了,所以都比中值大,中值在數(shù)組2中,簡(jiǎn)單的說(shuō)就是數(shù)組1割后的左邊是空了,所以我們可以假定LMax1 = INT_MIN
C1 =2*len1 —— 數(shù)組1整體都在左邊了,數(shù)組1割后的右邊是空了,中值在數(shù)組2中,在數(shù)組1中你找不到元素能滿(mǎn)足(LMax2<=RMin1) ,所以我們可以假定RMin1= INT_MAX。
C2 = 0 —— 數(shù)組2整體在右邊了,數(shù)組2割后的左邊是空了,所以我們可以假定LMax2 = INT_MIN.
C2 = 2*len2 —— 數(shù)組2整體在左邊了,數(shù)組2割后的右邊是空了,為了讓LMax1 < RMin2 恒成立,我們可以假定RMin2 =INT_MAX,事實(shí)上,僅當(dāng)len1=len2 時(shí)可能觸發(fā)這種結(jié)果。
#define debug(x) cout<<#x<<x<<endl;
#define max(a,b) (((a) > (b)) ? (a) : (b))
#define min(a,b) (((a) < (b)) ? (a) : (b))
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int len1=nums1.size();
int len2=nums2.size();
if(len1>len2)
{
return findMedianSortedArrays(nums2,nums1);
}
int LMax1,LMax2,RMin1,RMin2,cut1,cut2,lf=0,rt=2*len1;
while(lf<=rt)
{
cut1=(lf rt)/2;
cut2=len1 len2-cut1;
LMax1=(cut1==0)?INT_MIN:nums1[(cut1-1)/2];
LMax2=(cut2==0)?INT_MIN:nums2[(cut2-1)/2];
RMin1=(cut1==2*len1)?INT_MAX:nums1[cut1/2];
RMin2=(cut2==2*len2)?INT_MAX:nums2[cut2/2];
if(LMax1>RMin2)
rt=cut1-1;
else if(LMax2>RMin1)
lf=cut1 1;
else
break;
}
return (max(LMax1,LMax2) min(RMin1,RMin2))/2.0;
}
}; 來(lái)源:https://www./content-4-658451.html
|