Algorithm 04 : 尋找兩個有序陣列中的第N個數,要求時間複雜度為O(logm+logn)
Question : Give a divide and conquer algorithm for the following problem : you are
given two sorted lists of size m and n, and are allowed unit time access
to the ith element of each list. Given an O(logm+logn) time algorithm for
computing the kth largest element in the union of the two lists.
(For simplicity, you can assume that the elements of the two lists are
distinct).
問題:尋找兩個有序陣列中的第N個數,要求時間複雜度為O(logm+logn)。
[color=blue]歡迎提出更優化的解決方案,謝謝![/color]
given two sorted lists of size m and n, and are allowed unit time access
to the ith element of each list. Given an O(logm+logn) time algorithm for
computing the kth largest element in the union of the two lists.
(For simplicity, you can assume that the elements of the two lists are
distinct).
問題:尋找兩個有序陣列中的第N個數,要求時間複雜度為O(logm+logn)。
/**
* @author YuHuang
* @vision 2011-10-04
* This program is only for algorithm training.
*
*/
import java.lang.RuntimeException;
public class SearchKthNumber {
private int[] aArray;
private int[] bArray;
public SearchKthNumber(int[] aArray,int[] bArray){
this.aArray=aArray;
this.bArray=bArray;
if(this.aArray==null||this.bArray==null){
throw new RuntimeException("Array should not be null!");
}
}
public int doSearch(int aLeft,int aRight,int bLeft,int bRight,int k){
int aMiddle = (aLeft+aRight)/2;
int bMiddle = (bLeft+bRight)/2;
if(aLeft>aRight){
return bArray[bLeft+k-1];
}
if(bLeft>bRight){
return aArray[aLeft+k-1];
}
if(aArray[aMiddle]>bArray[bMiddle]){
if(k<=(aMiddle-aLeft)+(bMiddle-bLeft)+1){
return doSearch(aLeft,aMiddle-1,bLeft,bRight,k);
}else{
return doSearch(aLeft,aRight,bMiddle+1,bRight,k-(bMiddle-bLeft)-1);
}
}else{
if(k<=((aMiddle-aLeft)+(bMiddle-bLeft)+1)){
return doSearch(aLeft,aRight,bLeft,bMiddle-1,k);
}else{
return doSearch(aMiddle+1,aRight,bLeft,bRight,k-(aMiddle-aLeft)-1);
}
}
}
public static void main(String[] args){
int[] aArray=new int[]{1,3,5,6,8,9,11,18,20};
int[] bArray=new int[]{2,4,7,16,22,29,39,40,55,100};
SearchKthNumber sn=new SearchKthNumber(aArray,bArray);
int k=2;
int result=sn.doSearch(0,aArray.length-1,0,bArray.length-1,k);
System.out.println("The "+k+"th"+" Number : "+result);
}
}
[color=blue]歡迎提出更優化的解決方案,謝謝![/color]
相關文章
- 尋找兩個有序陣列的中位數陣列
- LeetCode第4題:尋找兩個有序陣列的中位數LeetCode陣列
- LeetCode--尋找兩個有序陣列的中位數(05)LeetCode陣列
- 時間複雜度O(n)和空間複雜度時間複雜度
- [LeetCode 刷題] 4. 尋找兩個有序陣列的中位數 (Hard)LeetCode陣列
- 尋找陣列中和為定值的兩個數陣列
- 合併兩個有序陣列,其中有一個陣列長度足夠長,在O(1)的空間複雜度裡進行合併陣列複雜度
- LeetCode解題(C++)-4. 尋找兩個有序陣列的中位數LeetCodeC++陣列
- 時間複雜度O(1)、O(n)、O(n²)、O(nlogn)的含義時間複雜度
- 尋找兩個正序陣列中的中位數陣列
- 兩個有序陣列的中位數陣列
- 時間複雜度為 O (n^2) 的排序演算法時間複雜度排序演算法
- 時間複雜度為 O(n^2) 的排序演算法時間複雜度排序演算法
- 將兩個有序陣列合併為一個有序陣列陣列
- 4. 尋找兩個正序陣列的中位數陣列
- Java實現:排序演算法--時間複雜度為O(n² )Java排序演算法時間複雜度
- 兩個有序陣列如何合併成一個有序陣列陣列
- 【遞迴打卡2】求兩個有序陣列的第K小數遞迴陣列
- 隨機列印0-100的全部數字並且不可重複,時間複雜度為O(n)隨機時間複雜度
- 【LeetCode Hot 100】4. 尋找兩個正序陣列的中位數LeetCode陣列
- GO實現:leetcode之尋找兩個正序陣列的中位數GoLeetCode陣列
- 尋找陣列中的最大值和最小值O(1.5*N)陣列
- 判斷連結串列是否為迴文結構,空間負責度為O(1),時間複雜度為O(n)時間複雜度
- 合併兩個有序陣列陣列
- 力扣演算法題:尋找兩個正序陣列的中位數力扣演算法陣列
- 時間複雜度為 O(nlogn) 的排序演算法時間複雜度排序演算法
- 時間複雜度為O(nlogn)的排序演算法時間複雜度排序演算法
- LeetCode題集-4 - 尋找兩個有序陣列的中位數,圖文並茂,六種解法,萬字講解LeetCode陣列
- 尋找兩個正序陣列的中位數問題,方法一:合併陣列檢索法陣列
- PHP陣列函式的時間複雜度清單PHP陣列函式時間複雜度
- 尋找陣列中第K大的元素陣列
- 88、合併兩個有序陣列陣列
- 找一個陣列中特別的數陣列
- 88. 合併兩個有序陣列陣列
- leetcode 4. Median of Two Sorted Arrays 尋找兩個正序陣列的中位數(困難)LeetCode陣列
- Leetcode 234. 迴文連結串列 快慢指標+連結串列逆序實現O(n)時間複雜度且O(1)空間複雜度LeetCode指標時間複雜度
- 時間複雜度跟空間複雜度時間複雜度
- 時間複雜度與空間複雜度時間複雜度
- 時間複雜度和空間複雜度時間複雜度