Эта проблема может быть решена в O (1).
Если мы уберем 1 и посмотрим на числа от 2 до 30, мы заметим, что есть 22 числа.
Теперь, для любого числа x из 22 чисел, указанных выше, будет число x + 30 между 31 и 60, что также ужасно.Таким образом, мы можем найти не менее 22 чисел от 31 до 60. Теперь для каждого некрасивого числа от 31 до 60 мы можем записать его как s + 30. Так что s тоже будет безобразным, так как s + 30 делится на 2, 3или 5. Таким образом, между 31 и 60 будет ровно 22 числа. Эта логика может повторяться для каждого блока из 30 чисел после этого.
Таким образом, будет 23 числа в первых 30 числах и 22 для каждых 30 после этого.То есть, первые 23 уродства будут происходить между 1 и 30, 45 уродств будут происходить между 1 и 60, 67 уродств будут происходить между 1 и 30 и т. Д.
Теперь, если мне дают n, скажем, 137, яможно увидеть, что 137/22 = 6,22.Ответ будет лежать между 6 * 30 и 7 * 30 или между 180 и 210. К 180 у меня будет 6 * 22 + 1 = 133-е уродливое число в 180. У меня будет 154-е уродливое число в 210. Поэтому я ищу4-е уродливое число (так как 137 = 133 + 4) в интервале [2, 30], которое равно 5. Тогда 137-е уродливое число равно 180 + 5 = 185.
Другой пример: если я хочу 1500-енекрасивое число, я считаю 1500/22 = 68 блоков.Таким образом, у меня будет 22 * 68 + 1 = 1497-е уродство в 30 * 68 = 2040. Следующие три уродства в блоке [2, 30] - 2, 3 и 4. Таким образом, наше необходимое уродство - в 2040 + 4 =2044.
Суть в том, что я могу просто составить список уродливых чисел между [2, 30] и просто найти ответ, выполнив поиск в O (1).