Примечания к LeetCode [58]: [Kotlin] Просто и лаконично

Проблема



Интуиция

Ближайшие делители должны содержать квадратный корень из целевого числа. Таким образом, мы можем найти квадратный корень для num + 2, а затем выполнить цикл от квадратного корня до 2, чтобы найти делители.

Код

import kotlin.math.abs
import kotlin.math.sqrt

class Solution {
    fun closestDivisors(num: Int): IntArray {
        val result = intArrayOf(0, Int.MAX_VALUE)
        val sqrt = sqrt(num.toDouble() + 2).toInt() + 1
        listOf(num + 1, num + 2).forEach { number ->
            for (factor in sqrt downTo 2) {
                if (number % factor == 0) {
                    val remains = number / factor
                    if (abs(remains - factor) < abs(result[0] - result[1])) {
                        result[0] = factor
                        result[1] = remains
                    }
                    break
                }
            }
        }
        return result
    }
}

Анализ сложности

  • Временная сложность: O(sqrt{n})
  • Сложность пространства: O(1)