參考題解:題解
給定兩個大小為 m 和 n 的正序(從小到大)陣列 nums1 和 nums2。
請你找出這兩個正序陣列的中位數,並且要求演算法的時間複雜度為 o(log(m + n))。
你可以假設 nums1 和 nums2 不會同時為空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
則中位數是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
則中位數是 (2 + 3)/2 = 2.5
可以採用歸併排序中將兩個有序陣列合併成乙個陣列的思想,開創乙個容量為num1長度和num2長度和的大陣列,將原本有序的兩個小陣列合併成乙個大陣列。如果大陣列的長度為奇數,直接取出最中間的乙個元素。如果大陣列長度為偶數,去除中間兩個數字求平均。
設陣列一的長度為m,陣列二的長度為n.
和思路一的想法差不多,不需要開闢空間,直接用兩個指標分別指向兩個陣列,每次往後移動陣列較小的那個指標,知道移動到中位數的位置即可。
因為m+n有奇數和偶數兩種情況,對於總長度為奇數的話,我們需要找到第(m+n) / 2 + 1小的元素。對於總長度為偶數的情況,我們需要找到第(m+n) / 2和(m+n)/2+1小的元素的平均值。所以對於這兩種情況,我們都需要找(m+n)/2+1次,分別用left和right記錄每次找到的元素。最後根據奇偶判斷返回值。
這道題可以轉換為求第k小的數,要求中位數,就是求第(m+n+1)/2小的數。思路二指標每次往前移動乙個,相當於每次剔除掉乙個比第(m+n+1)/2小的數還小的數。
然而每次剔除掉乙個數速度太慢,我們要求第k小的數,每次可以分別在兩個陣列找到前k/2個數字,根據他們的相對大小,每次都剔除k/2個數字,直到最後再剩餘的陣列中找找第1小的數字,則直接比較兩個陣列的頭元素即可。
遞迴**如下所示,詳細的演算法講解比如邊界條件判斷,演算法正確性證明等可以在上面的題解鏈結檢視。
將兩個陣列分別在第i和位置和第j個位置切割,並將分別將左右合併成兩個陣列,然後左邊的最大值和右邊的最小值就是中位數。
重點要找i和j個位置。
public static double findmediansortedarrays(int nums1, int nums2)
} else if(p2 == n)
}else
}if((m + n) % 2 == 0)else
}
public static double findmediansortedarrays(int nums1, int nums2) else if(p2 == n)else else
}count++;
}if((m + n) % 2 == 0)else
}
public static double findmediansortedarrays(int nums1, int nums2)
public static int getkth(int nums1,int start1,int end1,int nums2,int start2,int end2,int k)else
}
public static double findmediansortedarrays(int nums1, int nums2)
int imin = 0,imax = m;
while (imin <= imax)
else if (i != 0 && j != n && nums1[i-1] > nums2[j])
else
else if (j == 0)
else
if ( (m + n) % 2 == 1 ) // 奇數的話不需要考慮右半部分
int minright = 0;
if (i == m)
else if (j == n)
else
return (maxleft + minright) / 2.0; //如果是偶數的話返回結果}}
return 0.0;
}
思路一和思路二的時間複雜度為o(m+n).
思路三和思路四由於都用了二分查詢,時間複雜度都降到了log級別。
LeetCode 4 尋找兩個正序陣列的中位數
給定兩個大小為 m 和 n 的正序 從小到大 陣列 nums1 和 nums2。請你找出這兩個正序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是2.0 示例 2 nums1...
LeetCode 4 尋找兩個正序陣列的中位數
原題目 思路 如果某乙個陣列的長度為零,直接返回另外乙個陣列的中位數,否則 用雙指標法將兩個陣列合併為乙個陣列 o n m 然後返回該陣列的中位數。class solution else if n 0 else int count 0,i 0,j 0 vectors n m while iwhile...
LeetCode 4 尋找兩個正序陣列的中位數
題目要求的時間複雜度是log m n 如果不對時間複雜度做要求可以使用雙指針對陣列進行遍歷即可。我們把這個題轉換成查詢第k小整數,解題思路如下 首先宣告,下面的思路非常值得反覆複習。假設我們要找第 7 小的數字。我們比較兩個陣列的第 k 2 個數字,如果 k 是奇數,向下取整。也就是比較第 3 個數...