Сортировка списка значного числа и получение 1-й и 2-й большие цифры дадут вы в лучшем случае O(n * log n)
сложность времени (при условии, что вы будете использовать Quick Sort).
Вы можете добиться более высокой производительности, если будете использовать другой подход: переставьте (переупорядочивайте) свой массив (как в быстрой сортировке), так что у вас будет сводное значение, которое делит ваш массив на две части: те, которые меньше, чем опорные находятся в левой части (левая подматрица), те, которые больше, находятся в правой части (правый подматрица). Проверьте индекс оси:
- , если он равен размеру массива цифр минус 2, чем это второй по величине элемент (первый самый большой находится рядом с ним, в правом подрешетке);
- если индекс поворота меньше размера массива цифр минус 2, повторите разделение для правой подматрицы;
- если индекс поворота больше размера массива цифр минус 2, повторите разбиение на левую подматрицу;
В какой-то момент ваш стержень будет вторым элементом из конца массива, что означает, что это второй по величине элемент, а наибольшее число - в конце массива (из-за того, что вы получить стержень). Сложность времени будет лучше, чем для быстрого сортировки, потому что после каждого раздела вы разбиваете только один поддиапазон, а не оба.
Вы можете расширить этот подход, чтобы получить не только 1-й и 2-й по величине разряды, но и k-й (произвольный самый высокий) разряд, а также не только самый большой, но и самый маленький.
Заканчивать кусок кода, который я написал пару дней назад:
public Long selectKthElement(int left, int right, int k, Type type) {
int med = partitionIt(left, right);
if ((type.equals(Type.Smallest) && med == k - 1) || (type.equals(Type.Largest) && med == nElems - k)) {
return theArray[med];
} else if (type.equals(Type.Smallest) && med > k || type.equals(Type.Largest) && med > nElems - k) {
return selectKthElement(left, med - 1, k, type);
} else if (type.equals(Type.Smallest) && med < k || type.equals(Type.Largest) && med < nElems - k){
return selectKthElement(med + 1, right, k, type);
} else {
// impossible case, but the source code won't compile w/o the else
return null;
}
}
Здесь theArray
массив цифр чисел, partitionIt
метод сортирует массив и возвращает индекс медианы, вы можете либо выяснить, как написать его реализацию самостоятельно, либо выполнить поиск в Интернете.
Единственный путь сделать это в одном цикле будет хранить список всех значений, сортировать их и тянуть два довершение. – christopher
Итак, вы пытаетесь получить '7' и' 5' из '125673'? Кроме того, вы проверяете дубликаты? –
ваш цикл while не будет доступен, поскольку num = 0. – Sionnach733