Я реализую подход «разделяй и властвуй» для рекурсивного решения проблемы максимальной суммы.Я получил его для обычного массива, но я изо всех сил пытаюсь реализовать его для кругового массива.
Сейчас я пытаюсь использовать модуль, чтобы просто дважды пройти массив в основном.Но это не дает мне правильных результатов, и я не уверен, почему.
Вот мой код:
Рекурсивный вызов:
private static int maxSubarray(int[] arr, int low, int high) {
//base case
if(high == low) {
return(arr[low % arr.length]);
} else {
int mid = (low + high)/2;
return Math.max(Math.max(maxSubarray(arr, low, mid),
maxSubarray(arr, mid+1, high)), maxCrossing(arr, low, mid, high));
}
}
Перекрестный вызов:
private static int maxCrossing(int[] arr, int low, int mid, int high) {
int leftSum = Integer.MIN_VALUE;
int sum = 0;
for (int i = mid % arr.length; i >= low % arr.length; i--) {
sum += arr[i];
if(sum > leftSum) {
leftSum = sum;
}
}
int rightSum = Integer.MIN_VALUE;
sum = 0;
for(int j = (mid + 1) % arr.length; j <= high % arr.length; j++) {
sum += arr[j];
if(sum > rightSum) {
rightSum = sum;
}
}
return(leftSum + rightSum);
}
Любая помощь будет признательна!Все в приведенном выше коде, которое имеет «% arr.length», отличается от реализации некруглого массива.
Кроме того, я не собираюсь реализовывать метод Кадане.
РЕДАКТИРОВАТЬ:
Забыл упомянуть, что мой начальный вызов будет maxSubarray (arr, 0, arr.length * 2 - 1) - по сути, дважды пройдя по элементам.
РЕДАКТИРОВАТЬ 2:
Здесь кое-что понял.Поскольку это задание, я подожду до истечения срока, чтобы опубликовать свое рабочее решение.