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)。
/**
* @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);
}
}
欢迎提出更优化的解决方案,谢谢!
分享到:
相关推荐
O(logN)的时间复杂度是一种高效的算法复杂度,意味着算法的运行时间与问题规模的对数成正比。这样的算法通常在处理大规模数据时表现出色,因为它们能够快速定位到所需的元素或解决问题。以下是三个具有O(logN)时间...
在内层循环中,通过`left`和`right`指针寻找另外两个数,使三者的和为零。注意,为了避免重复解,我们还需检查当前元素与前一个元素是否相等,并在找到解后跳过可能的重复值。 这种解决方案的时间复杂度是O(n^2),...
在数组中,子数组是由数组中任意两个下标i和j(i )确定的一段连续元素的集合,即原数组的第i个元素到第j个元素。因此,数组A[0...n-1]的子数组可以表示为A[i...j],其中0 <= i <= j < n。 解决这个问题的关键在于...
在《一种O(n + nlog₂m)时间复杂度的排序算法》这篇论文中,作者提出了一种新颖的排序算法,该算法的时间复杂度为O(n + nlog₂m),其中m为原始输入数据序列中有序或逆序子序列的数量,范围为1到n²(1 ≤ m ≤ n²)...
快速排序是一种内部排序算法,它的时间复杂度为O(n log n),空间复杂度为O(log n)。快速排序的算法步骤如下: 1. 选择一个元素作为枢轴元素。 2. 将数组中的所有元素分为两个部分:小于枢轴元素的部分和大于枢轴...
5.5 如何去除有序数组的重复元素本文对应的力扣题目:26.删除排序数组中的重复项83.删除排序链表中的重复元素删除排序数组中的重复项:// 长度为索引 + 1
插入操作的时间复杂度取决于需要移动的元素数量,平均情况下需要移动j/2个元素,因此总时间复杂度为O(n^2)。如果数组已经接近排序,则插入操作的时间复杂度可以降为O(n)。 **3. 使用链表的影响(c)** - **问题...
它的平均和最坏时间复杂度为O(n²),在最佳情况下(已排序数组)的时间复杂度为O(n)。 2. 插入排序(Insertion Sort) 插入排序将数组分为已排序和未排序两部分,每次将一个未排序元素插入到已排序部分的正确位置。...
分析:如果由前至后合并,复杂度将会是O(N2),这样的复杂度显然不是最优解,利用两个指针指向两个数组的尾部,从后往前遍历,这样的复杂度为O(n2) 由此可以写出下面的代码: #include #include <algorithm> #...
3. 选择排序(Selection Sort):每次找出未排序部分的最大/小元素与未排序部分的第一个元素交换,时间复杂度为O(n^2)。 4. 快速排序(Quick Sort):利用分治策略,选取一个基准元素,将小于基准的放左边,大于...
在这种情况下,可以考虑使用更高效的算法,例如快速选择算法,它是在快速排序的基础上修改而来,专门用于寻找数组中的第K小(大)元素,平均时间复杂度为O(n),但最坏情况下为O(n^2)。不过,对于这个问题,简单的...
- 二分查找:适用于有序数组,时间复杂度为O(logn)。 - 哈希查找:通过哈希表快速定位,理想情况下时间复杂度为O(1)。 3. 图算法: - 广度优先搜索(BFS):用于遍历图,找到最短路径。 - 深度优先搜索(DFS):...
为了找到最大值和最小值,我们可以初始化两个变量,分别作为当前的最大值和最小值,并设定初始值为数组的第一个元素。然后再次遍历数组,与当前最大值和最小值进行比较,如果找到更大的值就更新最大值,找到更小的值...
leetcode下载 [toc] 一、题目 Q1 等差数列求和 ...在一个无序数组中,任意相邻两个数不等 局部最小数:这个数比它的左边和右边都小,这个数被称为局部最小 问题:找到任意一个(随便一个)局部最小的
4. 斐波那契查找:在有序数组中,结合斐波那契数列进行查找,平均时间复杂度为O(log n)。 接下来是排序算法,它们用于重新排列数据集合,使得元素按照特定顺序排列。Java中的常见排序算法有: 1. 冒泡排序:通过...
4. **Median of Two Sorted Arrays** (Hard): 寻找两个有序数组的中位数。常用的方法是二分查找,通过缩小搜索范围来降低时间复杂度。 5. **Longest Palindromic Substring** (Medium): 找出字符串中最长的回文子串...
对于小规模数据或接近有序的数组,插入排序表现良好,时间复杂度为O(n^2)。 4. 希尔排序:希尔排序是对插入排序的一种改进,通过增量序列将数据分组进行排序,然后逐渐减少增量直到为1。其时间复杂度通常比O(n^2)好...
对于两个有序数组,可以采用双指针法,分别从头开始比较,找到相同的元素。 7. **求三个数组的共同元素**: 可以先找出两个数组的交集,再找这个交集与其他数组的交集。 8. **找出数组中唯一的重复元素**: ...
冒泡排序的时间复杂度为O(n^2),适用于小规模或部分有序的数据。 2. **桶排序**:桶排序是一种分布式排序算法,它将数据分到有限数量的桶里,每个桶再分别排序。当输入数据均匀分布时,桶排序可以达到线性时间...