Здравствуйте, сутра начал делать данную задачу и понял насколько всё плачевно. Разобрался со многими вещами, но что делать дальше не представляю. В интернете конечно же нашёл кучу вариантов, но вроде ни один в 10 сек при Long.MAX_VALUE не уложился. Обращаюсь к решившим без помощи готового массива за помощью. Буду очень благодарен :)
public class Solution {
    public static long[] getNumbers(long N) {
        long[] result = null;
        long[][] degrees = new long[9][20]; //массив готовых результатов возведения числел в степень
        ArrayList<Long> toRes = new ArrayList<>(); //В данный лист будем добавлять числа Армстронга
        //Заполняем массив результатов
        for (int c = 1; c <= 9; c++) {
            for (int k = 1; k <= 20; k++) {
                long res = c;
                for (int p = 0; p < k - 1; p++) {
                    res *= c;
                }
                degrees[c - 1][k - 1] = res;
            }
        }
        //Сразу добавляем числа, которые не требуют проверки
        for(long c = 1; c<10; c++){
            toRes.add(c);
        }
        //Начинаем брать все числа, у которых каждая прошлая цифра больше следующей.
        for (long c = 10; c < N; c++) {
            String next = Long.toString(c); //Берём наше число и превращаем в строку
            int toCheck = 1; //Будет увеличиваться если
            for (int k = 0; k < next.length(); k++) { //Проходим по всем цифрам числа c
                if (k > 0) {
                    if (Integer.parseInt(Character.toString(next.charAt(k - 1))) >= Integer.parseInt(Character.toString(next.charAt(k)))) {
                        toCheck++;
                    }else{
                        break;
                    }
                }
            }
            //Если все цифры подошли под условие, то будем проверять является ли данное число числом Армстронга, если нет, то просто их отбрасываем
            if (toCheck == next.length()) {
                long key = 0;  //Число для получения результата сложения цифр возведённых в свою степень
                for (int k = 0; k < next.length(); k++) {
                    char num = next.charAt(k);
                    if (num != '0') { //Если следущая цифра не является нулём, то к ключу добавляем результат возведения этой цифры в нужную степень
                        long now = degrees[Integer.parseInt(Character.toString(num)) - 1][next.length() - 1];  //Извлекаем число из уже готового массива
                        key += now;
                    }
                }
                String firstKey = Long.toString(key);  //Переводим полученный результат в строку
                if (firstKey.length() == next.length()) {  //Если в рузльтате сложения не получилось число, которое длинее первоначального, то будем проверять является ли оно числом Армстронга
                    long numToCheck = 0;  //Аналогично предыдущему циклу
                    for (int k = 0; k < firstKey.length(); k++) {
                        char num = firstKey.charAt(k);
                        if (num != '0') {
                            long now = degrees[Integer.parseInt(Character.toString(num)) - 1][firstKey.length() - 1];
                            numToCheck += now;
                        }
                    }
                    if (numToCheck == key) {  //Теперь если полученное число является числом Армстронга, добавляем его в лист toRes
                        toRes.add(key);
                    }
                }
            }
        }
        //Переносим полученные числа в массив
        result = new long[toRes.size()];
        for (int c = 0; c < toRes.size(); c++) {
            result[c] = toRes.get(c);
        }
        return result;
    }
    public static void main(String[] args) {
        long[] nums = getNumbers(100000);
    }
}