从两个排序数组中获取前 K 项而不合并它们
Posted
技术标签:
【中文标题】从两个排序数组中获取前 K 项而不合并它们【英文标题】:Getting the top K item from two sorted arrays without combine them 【发布时间】:2019-04-19 03:26:29 【问题描述】:我试图从两个排序数组中获取最大的 K 元素而不合并它们。我的代码使用了分而治之的算法,我试图将两个数组与中间元素分开,然后我检查中间的数组是否大于另一个我将数组的末尾移到中间,然后我将 k 减少到中间,我将另一个数组从它的开始移到中间。
我的问题是输入量大,导致堆栈溢出异常。我不知道为什么,但我认为这是因为如果中间的减法和数组的长度大于K,我将数组的开头移到中间的语句,我无法解决它。
谁能帮我一个忙,请帮助我?
public static int GetKthItem(int[] arr1, int[] arr2, int N, int M, int K,
int start1, int start2, int end1, int end2)
if (end1 + end2 == K)
return Math.Max(arr1[0], arr2[0]);
if (end1 + end2 + 1 == K)
return Math.Min(arr1[0], arr2[0]);
if (start1 == end1 && K > 0)
K--;
if (K > end2 - start2)
return arr2[start2];
else
return arr2[end2 - K];
else if (start2 == end2 && K > 0)
K--;
if (K > end1 - start1)
return arr1[start1];
else
return arr1[end1 - K];
if (K == 0)
return Math.Max(arr1[end1], arr2[end2]);
int mid1 = (end1 - start1) / 2;
int mid2 = (end2 - start2) / 2;
if (arr2[mid2] >= arr1[mid1])
if (end2 - mid2 <= K)
return GetKthItem(arr1, arr2, N, M, (K - (end2 - mid2)), mid1,
start2, end1, mid2);
else
return GetKthItem(arr1, arr2, N, M, K, mid1, start2, end1, end2);
else
if (end1 - mid1 <= K)
return GetKthItem(arr1, arr2, N, M, (K - (end1 - mid1)), start1,
mid2, mid1, end2);
else
return GetKthItem(arr1, arr2, N, M, K, start1, mid2, end1, end2);
【问题讨论】:
数组是预排序的? 这个问题的答案可能也有一些见解softwareengineering.stackexchange.com/q/194646/34408 堆栈溢出是深度递归的后果之一。除非该函数适合尾调用递归优化,否则最好提出某种与递归算法等效的迭代。 为什么要撤消删除水平滚动的格式?现在人们必须水平和垂直滚动才能阅读它。通常代码应该被格式化,所以不需要水平滚动。 你可以看看第三个例子here,它用C++实现了这个 【参考方案1】:如果这两个数组已经排序,你需要得到最大的 K 个元素。 您可以有 2 个指针 P1 和 P2。 P1 = 数组 1 的最后一个元素 [因为已经排序将是最后一个元素] P2 = 数组 2 的最后一个元素
然后
result[] -- new result array
index = 0
while(index<k)
if (Arr1[P1] > Arr2[P2])
result[index] = Arr1[P1]
P1--
else
result[index] = Arr2[P2]
P2--
index++
【讨论】:
以上是关于从两个排序数组中获取前 K 项而不合并它们的主要内容,如果未能解决你的问题,请参考以下文章