Получение верхнего элемента K из двух отсортированных массивов без объединения их - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь получить наибольший элемент К из двух отсортированных массивов, не объединяя их.В моем коде используется алгоритм «разделяй и властвуй», я пытаюсь отделить два массива от среднего элемента, и после этого проверяю, больше ли массив одного из середин, чем другого, я сдвигаю конец массива в середину иуменьшите 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);
    }
}
}

1 Ответ

0 голосов
/ 16 ноября 2018

Хорошо, если два массива уже отсортированы, и вам нужно получить наибольшие 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++
}
...