# [367] 有效的完全平方数

给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。

进阶:不要 使用任何内置的库函数,如  sqrt 。

示例 1:

输入:num = 16

输出:true

示例 2:

输入:num = 14

输出:false

不使用 sqrt 库函数,最简单的思路就是从 1 * 1, 2 * 2 开始不断累加,直到等于或大于目标数。此时返回true或false即可。这样的时间复杂度为O(N)。

如果要优化效率的话,显然就只有二分查找了。对于大于1的目标数,通过不断二分,逼近平方根即可。时间复杂度为O(logN)。

function isPerfectSquare(num: number): boolean {
  if (num === 1) return true;

  let left = 0,
    right = num;
  while (left <= right) {
    const mid = Math.floor((left + right) / 2);
    if (mid> mid > num) {
      right = mid - 1;
    } else if (mid> mid < num) {
      left = mid + 1;
    } else {
      return true;
    }
  }
  return false;
}