題目描述: 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)
}
手寫實現很多思路,我覺得這樣寫是最清晰明了的
publicposted @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);}}
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...