4. 尋找兩個有序數組的中位數
https://leetcode-cn.com/problems/median-of-two-sorted-arrays/
最簡單的就是用最簡單的,把兩個數組分別抽出然后排成一個排好序的數組,然后根據中位數的定義,直接根據中間的索引值得到中位數的值。
如果上面這么說明有些抽象的話,我們來看看代碼:
Show the Code.
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int[] all = new int[nums1.length + nums2.length];
int index1 = 0;
int index2 = 0;
int allIndex = 0;
int len1 = nums1.length;
int len2 = nums2.length;
while (index1 < len1 && index2 < len2) {
if (nums1[index1] <= nums2[index2]) {
all[allIndex] = nums1[index1];
index1++;
} else {
all[allIndex] = nums2[index2];
index2++;
}
allIndex++;
}
while (index1 < len1) {
all[allIndex] = nums1[index1];
index1++;
allIndex++;
}
while (index2 < len2) {
all[allIndex] = nums2[index2];
index2++;
allIndex++;
}
int midIndex = (len1 + len2) / 2;
if ((len1 + len2) % 2 == 0) {
return (all[midIndex - 1] + all[midIndex]) / 2.0;
} else {
return all[midIndex];
}
}
}
以上的時間復雜度就是$O(N+M)$,但是這肯定不是最好的做法,最好的做法,時候來看了答案的解析才明白的,不得不說思想的巧妙,真的是要多看幾遍。這里放上連接吧
這里就貼一下代碼。
https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/xun-zhao-liang-ge-you-xu-shu-zu-de-zhong-wei-shu-b/
class Solution {
public double findMedianSortedArrays(int[] A, int[] B) {
int m = A.length;
int n = B.length;
if (m > n) { // to ensure m<=n
int[] temp = A; A = B; B = temp;
int tmp = m; m = n; n = tmp;
}
int iMin = 0, iMax = m, halfLen = (m + n + 1) / 2;
while (iMin <= iMax) {
int i = (iMin + iMax) / 2;
int j = halfLen - i;
if (i < iMax && B[j-1] > A[i]){
iMin = i + 1; // i is too small
} else if (i > iMin && A[i-1] > B[j]) {
iMax = i - 1; // i is too big
} else { // i is perfect
int maxLeft = 0;
if (i == 0) { maxLeft = B[j-1]; }
else if (j == 0) { maxLeft = A[i-1]; }
else { maxLeft = Math.max(A[i-1], B[j-1]); }
if ( (m + n) % 2 == 1 ) { return maxLeft; }
int minRight = 0;
if (i == m) { minRight = B[j]; }
else if (j == n) { minRight = A[i]; }
else { minRight = Math.min(B[j], A[i]); }
return (maxLeft + minRight) / 2.0;
}
}
return 0.0;
}
}
時間復雜度就是$O(log(N+M))$
其實二分查找有個很重要就是要找出三個要素:
1 達到退出的條件: 這個就比較復雜了,要根據情況而定
2 把區間縮小的條件: 這個就是有定式的,一般都是max =i-1
或者min = i + 1
3 修改中位值的操作:mid = (left + (right - left)>>1)
寫出最基礎的二分查找最基本的操作,但是真正可以完全理解二分思想,那又是另一個級別的故事了。