Easy草稿★★★★★O(log n) 時間 · O(1) 空間
Binary SearchMath
Patterns🎯 二分搜尋🧮 數學・組合
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

367Valid Perfect SquareBinary SearchEasyBinary Search

給定一個正整數 num,判斷它是否為完全平方數。不能使用內建的平方根函式。

Example:

Input: num = 16 Output: true

Intuition

TIP

在 [1, num] 上二分搜尋,找是否存在一個整數 x 使得 x*x == num。

Approaches

1. Try Each — O(sqrt(n)) / O(1)
  • Idea: 從 1 開始逐一檢查 i * i == num
  • Time: O(sqrt(n))
  • Space: O(1)
Try-Each Code
class Solution {
    fun isPerfectSquare(num: Int): Boolean {
        var i = 1L
        while (i * i < num) {
            i++
        }
        return i * i == num.toLong()
    }
}
⭐ 2. Binary Search — O(log n) / O(1)
  • Idea: 在 [1, num] 上二分搜尋,檢查 mid * midnum 的關係
  • Time: O(log n)
  • Space: O(1)
class Solution {
    fun isPerfectSquare(num: Int): Boolean {
        var left = 1L
        var right = num.toLong()
        while (left <= right) {
            val mid = left + (right - left) / 2
            val sq = mid * mid
            when {
                sq == num.toLong() -> return true
                sq < num -> left = mid + 1
                else -> right = mid - 1
            }
        }
        return false
    }
}

WARNING

使用 Long 避免 mid * mid 溢位,num 最大可達 2^31 - 1。

🔑 Takeaways