給定兩個有序陣列arr1和arr2,已知兩個陣列的長度分別為 m1 和 m2,求兩個陣列中的第 k 小數。要求時間複雜度o(log(m1 + m2))。
例如 arr1 = [1, 2,3],arr2 = [3,4,5,6],k = 4。
則第 k 小數為 3.
例如 arr1 = [0,1,2],arr2 = [3,4,5,7,8], k = 3;
則第 k 小數為 2.
難這道題和我上次講的那一道題是非常非常類似的:遞迴打卡1:在兩個長度相等的排序陣列中找到上中位數,如果沒看過的建議先看下,只是今天的這道題比上次的那道題少難一點,原理一樣。
下面我隨便講一下原理吧:採用遞迴的方法不斷縮小 k 的,把求第 k 小元素轉化為第 (k-k/2) 小元素....我舉個例子吧,比較容易理解。
我們假定 arr1 = [1, 2,3],arr2 = [3,4,5,6],k = 4。
mid1 = k/2 = 1。
mid2 = k/2 = 1。
此時 arr2[mid2] > arr2[mid1],那麼問題轉化為在陣列 arr1[mid1+1...m1]和陣列 arr2[0...m2] 尋找第(k-md1-1)小的元素。
不過這裡需要注意的是,有可能 k/2 的值是大於 m1 或者 m2的,所以如果 k/2 > m1 或者 m2 的話,我們直接令 md1 = m1-1 或者 md2 = m2-1 就行了。
**如下:
// 由於中位數會受長度是奇偶數的影響,所以我們可以把問題轉化為求
// ((n+m+1)/2+(n+m+2)/2)/2。
public double findmediansortedarrays(int nums1, int nums2)
public static int findkth(int arr1, int arr2, int k)
public static int findkth(int arr1, int l1, int r1, int arr2, int l2, int r2, int k)
// 測試
public static void main(string args) ;
int arr2 = ;
system.out.println(findkth(arr1, arr2, 2));
}
可以用迭代嗎?當然可以,不過留給你自己。
下次我還會再出一道與這兩道類似的題,不過,難度遞增。總共有三道這種題,一定要自己手動寫**,一定要自己手動寫**,一定要自己手動寫**。
兩個有序陣列的第k大數
coding utf 8 兩有序陣列的第k大 一種思路是用o m n 的空間複雜度,然後時間複雜度的話只需要o k 吧,就是從後往前掃k個就ok了 另一就是不需要額外的空復,然後時復o log m n 遞迴 a 19,11,8,7,4,2,0 b 13,8,6,3,1 k 4 m,n len a l...
求兩個有序陣列的中值
設陣列a的長度為m,陣列b的長度為n,兩個陣列都都是遞增有序的。求這兩個陣列的中值 如下 include int find median int a,int b,int m,int n,int s,int t b為空 if 0 n a p 太小了,從陣列a中找乙個更大的數嘗試 if c p 1 n ...
求兩個有序陣列歸併之後的第k個最小值
1.題目 給定兩個有序陣列 公升序 求兩個陣列合併之後的第k小值。2.分析 常規演算法將陣列合併,之後從前向後遍歷一次,找到k位的值,時間複雜度o m n 改進之後的演算法 不需要歸併兩個陣列,而是使用兩個指標分別從兩個有序陣列的起始向後走,如果a i b j 那麼i 直到a i b j 如果a i...