leetcode4 尋找兩個正序陣列的中位數

2021-10-06 11:03:38 字數 2151 閱讀 7882

參考題解:題解

給定兩個大小為 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 個數...