Каковы распространенные методы поиска второго по величине элемента массива и какова временная сложность каждого метода?

static int secondLargest(int n,int arr[]){

        int max=0,secondmax=-1;
        for(int i=0;i<n;i++){
            if (arr[i]>max){
                max=arr[i];
            }
        }
        for(int i=0;i<n;i++){
           if (arr[i]<max && arr[i]>secondmax){
                secondmax=arr[i];
            }
        }
return secondmax;



        // Arrays.sort(arr);
        // for(int i=1;i<n;i++){
        //     if (arr[n-i]!=arr[n-i-1]){
        //         return arr[n-i-1];
        //     }
        // }
        // return -1;
         
    }
}

Входы могут быть следующими

6
12 35 1 10 34 1

или

10
5 5 5 5 5 5 5 5 5 5

что мешает вам отсортировать массив и поместить элементы в список, который не принимает дубликатов?

Stultuske 14.08.2024 08:58

Если я отсортирую это, это добавит больше времени к ответу

Rishi Raj 14.08.2024 09:45

учитывая приведенные вами примеры, это не должно быть проблемой. Если вы будете отслеживать, как предложено в принятом ответе, вам нужно будет выполнить (по крайней мере) одну условную проверку для каждого элемента.

Stultuske 14.08.2024 09:51
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
56
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете перебирать массив и отслеживать самый большой и второй по величине элементы:

static int secondLargest(int arr[]) {
    // Input sanity
    if (arr == null || arr.length < 2) {
        throw new IllegalArgumentException("arr must have at least two elements");
    }

    // Initialization
    int max;
    int secondmax;
    if (arr[0] > arr[1]) {
        max = arr[0];
        secondmax = arr[1];
    } else {
        max = arr[1];
        secondmax = arr[0];
   }

   // Go over the rest of the elements
   for (int = 2; i < arr.length; ++i) {
       int elem = arr[i];
       if (elem >= max) {
           secondmax = max;
           max = elem;
       } else if (elem > secondmax) {
           secondmax = elem;
       }
   }

   return secondmax;
}

Это имеет временную сложность O(n) и пространственную сложность O(1), где n — длина массива.

Спасибо за вашу помощь! Потребовалось немного доработать, но я нашел решение.

Rishi Raj 14.08.2024 09:31

Я оставляю вам другое решение (сложность времени, которую я вам должен):

int max = 0, secondmax = 0;
for( int i = 0; i < n; i++ ) {
    if ( arr[i] > max ) {
          // "secondmax" takes the value contained in "max"
        secondmax = max;
          // "max" takes the value contained in "arr[i]"
        max = arr[i] ;
    }
    else if ( arr[i] > secondmax ) {
          // "secondmax" takes the value contained in "arr[i]"
        secondmax = arr[i];
    }
}

Время -> O(N) Пробел -> O(1)

static int secondLargest(int n,int arr[]){
   int max=arr[0],secondmax=-1;
    if (arr[0]>arr[1]){
        max=arr[0];
        secondmax=arr[1];
    }
    if (arr[0]<arr[1]){
        max=arr[1];
        secondmax=arr[0];
    }
        for(int i=2;i<n;i++){
            if (arr[i]>max){
                secondmax=max;
                max=arr[i];
            }
            else if (arr[i]>secondmax && arr[i]<max){
                secondmax=arr[i];
            }
        }
return secondmax;
    }
}

Другие вопросы по теме