Нахождение второго по величине числа в массиве - PullRequest
26 голосов
/ 11 апреля 2010

Мне сложно понять логику метода, чтобы найти второе по величине число в массиве. Используемый метод состоит в том, чтобы найти самое высокое в массиве, но меньше, чем предыдущее самое высокое (которое уже было найдено). То, что я до сих пор не могу понять, это то, почему || highest_score == second_highest необходимо. Например, я ввожу три числа: 98, 56, 3. Без него как наивысшее, так и второе наивысшее будет 98. Пожалуйста, объясните.

int second highest = score[0];  
if (score[i] > second_highest && score[i] < highest_score || highest_score == second_highest)   
    second_highest = score[i];

Ответы [ 39 ]

31 голосов
/ 11 апреля 2010

Я не уверен, что то, что вы сделали, решит проблему; Я думаю, что это маскирует еще одну проблему в вашей логике. Найти второе место на самом деле довольно просто:

 static int secondHighest(int... nums) {
    int high1 = Integer.MIN_VALUE;
    int high2 = Integer.MIN_VALUE;
    for (int num : nums) {
      if (num > high1) {
        high2 = high1;
        high1 = num;
      } else if (num > high2) {
        high2 = num;
      }
    }
    return high2;
 }

Это O(N) за один проход. Если вы хотите принять связи, то измените значение на if (num >= high1), но оно вернет Integer.MIN_VALUE, если в массиве нет хотя бы 2 элементов Он также вернет Integer.MIN_VALUE, если массив содержит только одно и то же число.

11 голосов
/ 11 апреля 2010
// Initialize these to the smallest value possible
int highest = Integer.MIN_VALUE;
int secondHighest = Integer.MIN_VALUE;

// Loop over the array
for (int i = 0; i < array.Length; i++) {

    // If we've found a new highest number...
    if (array[i] > highest) {

        // ...shift the current highest number to second highest
        secondHighest = highest;

        // ...and set the new highest.
        highest = array[i];
    } else if (array[i] > secondHighest)
        // Just replace the second highest
        secondHighest = array[i];
    }
}

// After exiting the loop, secondHighest now represents the second
// largest value in the array

Редактировать:

Упс. Спасибо, что указали на мою ошибку, ребята. Исправлено сейчас.
5 голосов
/ 11 апреля 2010

Если первый элемент, для которого изначально установлено значение second_highest, уже является самым высоким элементом, то он должен быть переназначен новому элементу, когда будет найден следующий элемент. То есть он инициализируется на 98 и должен быть установлен на 56. Но 56 не выше 98, поэтому он не будет установлен, если вы не выполните проверку.

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

2 голосов
/ 03 февраля 2015

Ответы, которые я видел, не будут работать, если есть два одинаковых самых больших числа, как в приведенном ниже примере.

        int[] randomIntegers = { 1, 5, 4, 2, 8, 1, 8, 9,9 };
        SortedSet<Integer> set = new TreeSet<Integer>();
        for (int i: randomIntegers) {
            set.add(i);
        }
        // Remove the maximum value; print the largest remaining item
        set.remove(set.last());
        System.out.println(set.last());

Я удалил его из набора, а не из массива

1 голос
/ 30 ноября 2017

Моя идея состоит в том, что вы предполагаете, что первый и второй члены массива - это ваш первый и второй максимум Затем вы берете каждый новый элемент массива и сравниваете его со вторым максимумом. Не забудьте сравнить второй максимум с первым. Если оно больше, просто поменяйте их местами.

   public static int getMax22(int[] arr){
    int max1 = arr[0];
    int max2 = arr[1];
    for (int i = 2; i < arr.length; i++){
        if (arr[i] > max2)
        {
            max2 = arr[i];
        }

        if (max2 > max1)
        {
            int temp = max1;
            max1 = max2;
            max2 = temp;
        }
    }
     return max2;
}
1 голос
/ 25 сентября 2012
 public static int secondLargest(int[] input) {
            int largest,secondLargest;

            if(input[0] > input[1]) {
                largest = input[0];
                secondLargest = input[1];
            }
            else {
                largest = input[1];
                secondLargest = input[0];
            }

            for(int i = 2; i < input.length; i++) {
                if((input[i] <= largest) && input[i] > secondLargest) {
                    secondLargest = input[i];
                }

                if(input[i] > largest) {
                    secondLargest = largest;
                    largest = input[i];
                }
            }

            return secondLargest;
        }
1 голос
/ 06 июля 2016
public class SecondLargestNumberInArray
{
    public static void main(String[] args) 
    {
        int arr[] = {99, 76, 47, 85, 929, 52, 48, 36, 66, 81,9};
        int largest = arr[0];
        int secondLargest = arr[0];

        System.out.println("The given array is:" );

        boolean find=false;
        boolean flag=true;

        for (int i = 0; i < arr.length; i++) 
        {
            System.out.print(arr[i]+"\t");
        }
        System.out.println("");

        while(flag)
        {
            for (int i = 0; i < arr.length; i++) 
            {
                if (arr[i] > largest) 
                {
                    find=true;
                    secondLargest = largest;
                    largest = arr[i];
                } 
                else if (arr[i] > secondLargest) 
                {
                    find=true;
                    secondLargest = arr[i];
                }
            }
            if(find)
            {
                System.out.println("\nSecond largest number is:" + secondLargest);
                flag=false;
            }else
            {
                largest = arr[1];
                secondLargest = arr[1];     
            }
        }
    }
}


Output is   

The given array is:
99  76  47  85  929 52  48  36  66  81  9

Second largest number is: -> 99
0 голосов
/ 17 июня 2018

Второй по величине элемент в массиве: В Java:

class test2{
    public static void main(String[] args) {

int a[] = {1,2,3,9,5,7,6,4,8};
Arrays.sort(a);
int aa = a[a.length -2 ];
System.out.println(aa);


    }//main

}//end

В Python:

a = [1, 2, 3, 9, 5, 7, 6, 4, 8]

aa = sorted(list(a))
print(aa)
aaa = aa[-2]
print(aaa)
0 голосов
/ 21 июля 2017

У меня есть самая простая логика, чтобы найти второе по величине число, возможно, это не так. Логика находит в массиве сумму двух чисел, которая имеет наибольшее значение, а затем проверяет, какая из двух простых больше

int ar[]={611,4,556,107,5,55,811};
int sum=ar[0]+ar[1];
int temp=0;
int m=ar[0];
int n=ar[1];
for(int i=0;i<ar.length;i++){
    for(int j=i;j<ar.length;j++){
        if(i!=j){
        temp=ar[i]+ar[j];
        if(temp>sum){
            sum=temp;
            m=ar[i];
            n=ar[j];
        }
        temp=0;

    }
    }
}
if(m>n){
    System.out.println(n);

}
else{
    System.out.println(m);
}
0 голосов
/ 14 февраля 2013

Если сложность времени не является проблемой, то вы можете запустить пузырьковую сортировку, и в течение двух итераций вы получите второе по величине число, поскольку в первой итерации цикла наибольшее число будет перемещено в последнюю. Во второй итерации второе по величине число будет перемещено рядом с последним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...