У меня возникла эта проблема «Внедрите этот метод, чтобы вернуть сумму двух наибольших чисел в заданном массиве».Сложность алгоритма
я решил его таким образом:
public static int sumOfTwoLargestElements(int[] a) {
int firstLargest = largest(a, 0, a.length-1);
int firstLarge = a[firstLargest];
a[firstLargest] = -1;
int secondLargest = largest(a, 0, a.length-1);
return firstLarge + a[secondLargest];
}
private static int largest(int s[], int start , int end){
if (end - start == 0){
return end;
}
int a = largest(s, start, start + (end-start)/2) ;
int b = largest(s, start + (end-start)/2+1 , end);
if(s[a] > s[b]) {
return a;
}else {
return b;
}
}
Объяснение: Я реализован метод 'largeset'. Этот метод отвечает за получение наибольшего числа в заданном массиве.
Я вызываю метод буксировки в том же массиве. Первый вызов получит первое наибольшее число. Я отложил его в переменную, и я заменил его на число «-1» в массиве. Затем я называю самый большой второй второй случай.
Кто-то может сказать мне, в чем сложность этого алгоритма?
Вы можете найти оба число в первом проходе и пощадите второй проход. Это не изменит сложность, но будет работать быстрее. :-) – assafmo
+1 для вышеуказанного комментария. Кроме того, если это всего лишь список чисел, тогда существуют и другие способы решения одного и того же ... если вы используете такой механизм, как сортировка count и т. Д. С незначительным дополнительным пространством и сложностью времени O (n) ... – dharam
Реальная мера сложность - это будущее читателей этого кода, время, которое они тратят на выяснение того, как это работает, когда будет выполняться гораздо более простой алгоритм. Нет никакой явной выгоды для рекурсии, или почему нужны два прохода через набор.И алгоритм принципиально нарушен (возвращает неверный результат), когда два самых больших целых числа в массиве меньше -1. Accckkk! – spencer7593