返回介绍

solution / 0300-0399 / 0367.Valid Perfect Square / README

发布于 2024-06-17 01:04:01 字数 4918 浏览 0 评论 0 收藏 0

367. 有效的完全平方数

English Version

题目描述

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

完全平方数 是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。

不能使用任何内置的库函数,如  sqrt

 

示例 1:

输入:num = 16
输出:true
解释:返回 true ,因为 4 * 4 = 16 且 4 是一个整数。

示例 2:

输入:num = 14
输出:false
解释:返回 false ,因为 3.742 * 3.742 = 14 但 3.742 不是一个整数。

 

提示:

  • 1 <= num <= 231 - 1

解法

方法一:二分查找

不断循环二分枚举数字,判断该数的平方与 num 的大小关系,进而缩短空间,继续循环直至 $left \lt right$ 不成立。循环结束判断 $left^2$ 与 num 是否相等。

时间复杂度:$O(logN)$。

class Solution:
  def isPerfectSquare(self, num: int) -> bool:
    left, right = 1, num
    while left < right:
      mid = (left + right) >> 1
      if mid * mid >= num:
        right = mid
      else:
        left = mid + 1
    return left * left == num
class Solution {
  public boolean isPerfectSquare(int num) {
    long left = 1, right = num;
    while (left < right) {
      long mid = (left + right) >>> 1;
      if (mid * mid >= num) {
        right = mid;
      } else {
        left = mid + 1;
      }
    }
    return left * left == num;
  }
}
class Solution {
public:
  bool isPerfectSquare(int num) {
    long left = 1, right = num;
    while (left < right) {
      long mid = left + right >> 1;
      if (mid * mid >= num)
        right = mid;
      else
        left = mid + 1;
    }
    return left * left == num;
  }
};
func isPerfectSquare(num int) bool {
  left, right := 1, num
  for left < right {
    mid := (left + right) >> 1
    if mid*mid >= num {
      right = mid
    } else {
      left = mid + 1
    }
  }
  return left*left == num
}
function isPerfectSquare(num: number): boolean {
  let left = 1;
  let right = num >> 1;
  while (left < right) {
    const mid = (left + right) >>> 1;
    if (mid * mid < num) {
      left = mid + 1;
    } else {
      right = mid;
    }
  }
  return left * left === num;
}
use std::cmp::Ordering;
impl Solution {
  pub fn is_perfect_square(num: i32) -> bool {
    let num: i64 = num as i64;
    let mut left = 1;
    let mut right = num >> 1;
    while left < right {
      let mid = left + (right - left) / 2;
      match (mid * mid).cmp(&num) {
        Ordering::Less => {
          left = mid + 1;
        }
        Ordering::Greater => {
          right = mid - 1;
        }
        Ordering::Equal => {
          return true;
        }
      }
    }
    left * left == num
  }
}

方法二:转换为数学问题

由于 n² = 1 + 3 + 5 + ... + (2n-1),对数字 num 不断减去 $i$ (i = 1, 3, 5, ...) 直至 num 不大于 0,如果最终 num 等于 0,说明是一个有效的完全平方数。

时间复杂度:$O(sqrt(N))$。

class Solution:
  def isPerfectSquare(self, num: int) -> bool:
    i = 1
    while num > 0:
      num -= i
      i += 2
    return num == 0
class Solution {
  public boolean isPerfectSquare(int num) {
    for (int i = 1; num > 0; i += 2) {
      num -= i;
    }
    return num == 0;
  }
}
class Solution {
public:
  bool isPerfectSquare(int num) {
    for (int i = 1; num > 0; i += 2) num -= i;
    return num == 0;
  }
};
func isPerfectSquare(num int) bool {
  for i := 1; num > 0; i += 2 {
    num -= i
  }
  return num == 0
}
function isPerfectSquare(num: number): boolean {
  let i = 1;
  while (num > 0) {
    num -= i;
    i += 2;
  }
  return num === 0;
}
impl Solution {
  pub fn is_perfect_square(mut num: i32) -> bool {
    let mut i = 1;
    while num > 0 {
      num -= i;
      i += 2;
    }
    num == 0
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文