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

2021-10-08 12:28:57 字數 1516 閱讀 1092

給定兩個大小為 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)/2,但是題目涉及到了log,一般涉及到了log的複雜度都是用二分法去作答,想了半天沒想到,看了看官方的,官方的解題思路過於嚴謹導致看不太懂,其實思路很簡單。

就是因為是中位數所以肯定是在中間的,那麼只要假設在num1中有乙個數,下標為i,那麼只要去num2[(m+n)/2-i]出找那個數是否小於num1[i],且

num2[m+n)/2-i+1]是大於num[i]的,

說明白點就是假設num1=,num2=,那麼下標為1的num[1],首先在num1中大於了乙個數,那麼我只需要在num2中大於乙個數,那麼我就是中位數了,所以我只需要判斷在num2中的大小關係即可判斷是否為中位數。然後用二分在num1中找那個數就好了

我又去看了一遍官方的解題我好像把他的方法一理解錯誤了,因為我就看了一點點,看了找第k個數只要比k個數大就好了,就想到了這個方法,我以為官方的方法一講的是這個,又看了方法二,還是方法二看的懂,我的算方法三吧,但也是二的主要思路。

方法二,大致是一樣的,確實方法而就是對我想出來的方法的一種細分的思路,它也是分為兩半,只要兩個num的前一半的最大值小於後一半的最小值,那麼答案就出來了,好像也不一樣,他這個思路更加簡潔且**更加好打。

**如下:

class

solution

int m = nums1.length;

int n = nums2.length;

int left =

0, right = m, ansi =-1

;// median1:前一部分的最大值

// median2:後一部分的最小值

int median1 =

0, median2 =0;

while

(left <= right)

else

}return

(m + n)%2

==0?(median1 + median2)

/2.0

: median1;

}}

官方的這個**也太精細了,一點多餘的**量的沒有,就連那個if裡面的判斷也用數學方法給弄成了乙個判斷而已,我還在i的取值中迷惑了半天,到底怎麼取,看了看官方的知道,官方的邏輯太清晰了,

官方解析鏈結

這個鏈結得儲存,這題有點經典的韻味我覺得這題出的夠好。

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

思路 我現在還沒有進行優化,大概就是合併陣列 參照之前的順序表合併 然後如果合併陣列的大小sum是偶數,返回sum 2和sum 2 1兩個元素除以二,如果sum是奇數則直接返回sum 2的元素 double findmediansortedarrays int nums1,int nums1size...

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

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

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

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