查詢兩個有序陣列的中位數和第K小的數

2021-07-10 17:26:53 字數 1130 閱讀 1274

陣列中查詢中位數

1、將兩個數組合合併並排序,查詢中位數,時間複雜度為o((n+m)lg(m+n)),空間複雜度o(m+n)。

2、分別比較兩個陣列的k/2處的數,如果mida < midb,說明要查詢的兩個數在陣列a的右半部分和陣列b的左半部份。如果mida>midb,說明要查詢的兩個數在陣列a的左半部分和陣列b的右半部份。每次比較丟掉一半,時間複雜度為o(lg(m+n)),空間複雜度為o(1)。以上說的半部分指的是k個值的半部分。

public static double getmid(int a,int b)

public static int getmid(inta,int starta,intb,int startb,int k)else

if(mida>midb)else

}

陣列中查詢第k小的值

1、將兩個數組合合併並排序,查詢中位數,時間複雜度為o((n+m)lg(m+n)),空間複雜度o(m+n)。

2、分別比較兩個陣列的中位數,如果mida < midb且兩個陣列一半的長度和midval小於等於k,說明要查詢的數肯定不在b陣列的右半部分。如果mida < midb且兩個陣列一半的長度和midval大於k,說明要查詢的數肯定不在a陣列的左半部分。如果mida>midb且兩個陣列一半的長度和midval小於等於k,說明要查詢的數肯定不在a陣列的右半部分。如果mida>midb且兩個陣列一半的長度和midval大於k,說明要查詢的數肯定不在b陣列的左半部分。每次比較丟掉a的一半或者b的一半,時間複雜度大於o(lg(m+n))小於o(n),空間複雜度為o(1)。

public

static

intgetkmin(int a, int b, int k)

public

static

intgetkmin(int a, int starta, int enda, int b,

int startb, int endb, int k) else

} else else

}}

第一種方法每次丟棄a和b的k個值的一半,第二種方法每次丟掉a或b的一半,因此第一種方法比較好。

查詢兩個有序陣列的中位數

題目 給定兩個大小為 m 和 n 的有序陣列nums1和nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設nums1和nums2不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 class solution for ...

兩個有序陣列中位數

大小m和n分別有兩個排序陣列a和b。找到兩個排序陣列的中值。總的執行時間複雜度應該是o log m n class solution return findkth a,b,0,0,m,n,s 2 findkth a,b,0,0,m,n,s 2 1 2 private double findkth v...

兩個有序陣列中位數

首先我們可以不斷分割得到這個kkk。首先兩個陣列都分配k 2 frac 2k 如果第k 2 frac 2k 個數,第乙個陣列小於第二個陣列,那麼第乙個陣列的k 2 frac 2k 個數一定不是答案。問題可以變成乙個子問題,上乙個陣列從k2 1 frac 1 2k 1開始。相當於我們每次要去掉k 2 ...