# LeetCode Easy 367. Valid Perfect Square
tags: leetcode
問題
アイデア
与えられた正整数num
が平方数か調べます.sqrt
は使ってはいけないようです.
大きい数の平方数は大きくなるという単調性を活かして二分探索が出来ると考えられます.
解法
探索する範囲の左端を1
として右端をnum
とします.
そして,その間の値mid
の二乗がnum
と一致するかどうかに応じて条件分岐をします.
気を付けるのはoverflowです.C++ではlong
を使えば大丈夫です.
計算量
- 時間計算量
- $O(\log num)$
- 空間計算量
- $O(1)$
C++
class Solution { public: bool isPerfectSquare(int num) { long left = 1, right = num; while (left < right) { long mid = left + (right - left) / 2; if (num < mid * mid) right = mid - 1; else if (num == mid * mid) return true; else left = mid + 1; } return false; } };