Как найти второе по величине число в массиве в Java?



Я просто практикую некоторые задания MIT java. Но я не знаю, как найти второе по величине число. http://ocw.csail.mit.edu/f/13



  public class Marathon {
public static void main(String[] arguments) {
String[] names = { "Elena", "Thomas", "Hamilton", "Suzie", "Phil",
"Matt", "Alex", "Emma", "John", "James", "Jane", "Emily",
"Daniel", "Neda", "Aaron", "Kate" };

int[] times = { 341, 273, 278, 329, 445, 402, 388, 275, 243, 334, 412,
393, 299, 343, 317, 265 };

for (int i = 0; i < names.length; i++) {
System.out.println(names[i] + ": " + times[i]);
}

System.out.println();
System.out.println("Largest Timing " + Largest(times));
System.out.println();

}

public static int Largest(int[] times) {
int maxValue = times[0];

for (int i = 1; i < times.length; i++) {
if (times[i] > maxValue) {
maxValue = times[i];
}
}
return maxValue;
}

}
1175   8  

8 ответов:

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

В настоящее время Следующий элемент может быть больше Макса или равен/меньше Макса, следовательно, достаточно одного if:

if (times[i] > maxValue) {
    maxValue = times[i];
}

С двумя переменными для рассмотрения, следующий элемент может быть

  • больше, чем max - max становится вторым по величине, а следующий элемент становится max
  • меньше максимального, но больше второго по величине - следующий элемент становится вторым по величине.

Специальная забота должна быть проявлена о начальном состоянии. Посмотрите на первые два элемента и назначьте больший из них max , а меньший-второму по величине; начните цикл с элемента номер три, если есть один.

Вот как вы можете его закодировать:

if (times[i] > maxValue) {
    secondLargest = maxValue;
    maxValue = times[i];
} else if (times[i] > secondLargest) {
    secondLargest = times[i];
}

Вместо того, чтобы прибегать к сортировке массива, вы можете просто сделать следующее:

  • держите a largestValue и A secondLargestValue
  • цикл через весь массив один раз, для каждого элемента:
    • проверьте, не превышает ли текущий элемент largestValue:
      • если да, то присвойте largestValue secondLargestValue, затем присвойте текущий элемент largestValue (думайте об этом как о сдвиге всего на 1)
      • Если нет, проверьте, не превышает ли текущий элемент secondLargestValue
        • если да, назначение текущего элемента к secondLargestValue
        • Если нет, ничего не предпринимайте.

O (n) время выполнения

O (1) требование к пространству

Вообще говоря:

Имеют два значения - "самый большой"и " несквит".

Инициализируйте оба в -9999 или что-то еще.

Просмотрите свой список. Если число больше ,чем" самый большой", установите" самый большой " на это число. Но прежде чем вы это сделаете, скопируйте старое" самое большое "значение в "notQuite".

Если, с другой стороны, число меньше, чем "самый большой", но больше, чем "notQuite", установите "notQuite" на это число.

Когда вы закончите изучать все числа, "notQuite" содержит второй по величине.

И обратите внимание, что, когда вы заполняете вышеуказанные числа, вы также можете сохранить "largestIndex" и "notQuiteIndex" и заполнить их соответствующими значениями индекса массива, чтобы вы могли определить "выигрышное" значение. Однако, к сожалению, если существует несколько одинаковых" самых больших "или" второстепенных " значений, простая схема индексации не работает, и вам нужно сохранить какой-то список.

    private void secondLargest(int arr[]){

    int maxOne=arr[0];
    int maxTwo=arr[1];

    for(int i=0;i<arr.length;i++){

        if(arr[i]>maxOne){

            maxTwo=maxOne;
            maxOne=arr[i];
        }else if (arr[i]>maxTwo) {

            maxTwo=arr[i];
        }

    }

    System.out.println(maxOne);
    System.out.println(maxTwo);
}

PHP ALGO

Если $arr задан массив

$a = 0; $b = 0; // These are two variables and set their value to minimum
 $i = 0 ; // this is incremental variable
 loop $i till count($arr)   // loop the array using foreach or for-loop till length of array
    if( $arr[i] > $a || $arr[i] > $b) 
       ($a < $b) ? $a = $arr[i]: $b = $arr[i] ; // this is conditional operator 
    loop ends

    echo 'Second largest number is : '. ($a < $b)? $a : $b;  // this is conditional operator and you can output the smallest of final two number 

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

private static int secLargest(int[] numbers) {
        int maxVal = 0;
        int nextMaxVal = 0;
        for (int i = 0; i < numbers.length; i++) {
            if (numbers[i] > maxVal) {
                nextMaxVal = maxVal;
                maxVal = numbers[i];

            }
            if (numbers[i] < maxVal) {
                nextMaxVal = maxVal;
                maxVal = numbers[i];

            }
        }
        return nextMaxVal;

    }
int largest=time[0];
int secondLargest=largest;
for(int i=0;i<time.length;i++){
    if(time[i]>largest){
        secondLargest=largest;
        largest=time[i];
    }
    else if(secondLargest<time[i] && time[i]<largest || secondLargest>=largest)
        secondLargest=time[i];
}
return secondLargest;
public void findMax(int a[]) {
    int large = Integer.MIN_VALUE;
    int secondLarge = Integer.MIN_VALUE;
    for (int i = 0; i < a.length; i++) {
        if (large < a[i]) {
            secondLarge = large;
            large = a[i];
        } else if (a[i] > secondLarge) {
            if (a[i] != large) {
                secondLarge = a[i];
            }
        }
    }
    System.out.println("Large number " + large + " Second Large  number " + secondLarge);
}

Приведенный выше код был протестирован с целочисленными массивами, имеющими повторяющиеся записи, отрицательные значения. Наибольшее число и второе по величине число извлекаются за один проход. Этот код не работает только в том случае, если массив содержит только несколько копий одного и того же числа, например {8,8,8,8}, или имеет только одно число.

Comments

    Ничего не найдено.