演算法總結之 在兩個長度相等的排序陣列中找到上中位數

2021-09-30 23:17:17 字數 2115 閱讀 8298

題目描述: arr1  和 arr2   長度都為n   求兩個陣列中所有數的上中位數

要求 時間複雜度 o(logn)  額外空間複雜度o(1)

這道題目的方法比較好玩:

這兩個陣列如下表示:

arr1[start1....end1]     arr2[start2...end2]

如果start1==start2  那麼也有start2==end2   此時元素總個數是2個,上中位數為最小的那個  

如果start1!=start2  令mid1=/2      mid1=/2

進而分情況

情況一、 如果arr1[mid1] == arr2[mid2]

如果兩個陣列長度為奇數或者偶數,那麼arr1[mid1] == arr2[mid2]=上中位數

情況二、如果arr1[mid1] >arr2[mid2]

如果長度為奇數、(假設為5)arr1的第三個數》arr2的第三個數  此時上中位數只能是從arr1的和arr2的的共同的上中位數找 

如果長度為偶數,(假設為4)arr1的第二個數》arr2的第二個數  此時上中位數只能是從arr1的和arr2的的共同的上中位數找 

如果arr1[mid1]**實現是這樣:

特別類似於二分查詢 哈哈  也是找mid 然後通過min去比較

其實兩個陣列長度是一致的  某種程度上說是當前陣列的影子 或者 對映吧 都是有關聯的 所以重點操作乙個陣列 然後通過某種關係去對映另外乙個陣列就ok了

比較兩個陣列mid的值 決定兩個陣列 後面遍歷的走向

廢話不多說,上**:

package

tt;public

class

test12

int start1 =0;

int end1 = arr1.length-1;

int start2=0;

int end2 = arr2.length-1;

int mid1 =0;

int mid2 =0;

int offset = 0;

while(start1

else

if(arr1[mid1]

else

}return

math.min(arr1[start1], arr2[start2]);

}public

static

void

main(string args)

}

結果:

手寫實現很多思路,我覺得這樣寫是最清晰明了的

public

class

test4

//執行業務邏輯 (左右指標)

int start1 = 0;

int end1 = arr1.length - 1;

int start2 = 0;

int end2 = arr2.length - 1;

while (start1

else

if (arr1[mid1]

//如果相等的話就直接返回了

return

math.min(arr1[start1], arr2[start1]);

}return

math.min(arr1[start1], arr2[start1]);

}public

static

void

main(string args) ;

int arr2 = ;

int midvalue =getmidvalue(arr1, arr2);

system.out.println(midvalue);}}

posted @

2017-08-23 10:56

toov5 閱讀(

...)

編輯收藏

求兩個長度相等的排序陣列的上中位數

給兩個排序好的整數陣列,陣列的長度是相同的,找到這兩個陣列的上中位數,也就是如果陣列是偶數的話,輸出前乙個中位數。時間複雜度o logn 空間複雜度o 1 public class upmedian if arr1.length arr2.length int start1 0 int end1 a...

演算法總結之 在兩個排序陣列中找到第K小的數

給定兩個有序陣列arr1 和 arr2 再給定乙個int k,返回所有的數中第k小的數 要求長度如果分別為 n m,時間複雜度o log min 額外空間複雜度o 1 解決此題的方法跟之前的求兩個陣列求中位數的情況,如出一轍 非常給力!此題目需要分情況討論 假設長度較短的陣列長度 lens 較長的l...

兩個排序演算法

然後貼 1 int num 10 2 time t tms 3 srand unsigned int time tms 生成種子 4for int i 0 i 10 i 生成陣列元素為10 的陣列59 1011 氣泡排序 12for int i 0 i 10 1 i 1324 25 1 int nu...