LeetCode | 数组 | 二分查找 | 69. x 的平方根【C++】

题目链接

题目描述

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

示例 1:

输入:x = 4
输出:2

示例 2:

输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

提示:

  • 0 <= x <= 231 - 1

分析

由于输出结果的时候需要将小数部分舍去,因此问题的答案平方以后一定不会大于输入的整数。综上,该题可转变为查找整数的问题:

  • 如果这个整数的平方 恰好等于 输入整数,那么我们就找到了这个整数;
  • 如果这个整数的平方 严格大于 输入整数,那么这个整数肯定不是我们要找的那个数;
  • 如果这个整数的平方 严格小于 输入整数,那么这个整数 可能 是我们要找的那个数。

直觉上,一个整数的平方根肯定不会超过它自己的一半,但是 0 和 1 除外,因此我们可以在 1 到输入整数除以 2 这个范围里查找我们要找的平方根整数。

代码实现

class Solution {
public:
    int mySqrt(int x) {
        // 特殊值判断
        if (x == 0){
            return 0;
        }
        if (x == 1){
            return 1;
        }

        int left = 1;
        int right = x / 2;
        // 在区间 [left, right] 查找目标元素
        while (left <= right) {
            int middle = left + ((right - left) / 2);
            // 注意:这里为了避免乘法溢出(middle*middle),改用除法
            if (middle > x / middle) { // 猜的数平方以后大了就往小了猜
                // 下一轮搜索区间是 [left, middle - 1]
                right = middle - 1;
            } else if (middle < x / middle) { // 猜的数平方以后小了,可能猜的数就是,也可能不是
                // 下一轮搜索区间是 [middle + 1, right]
                left = middle + 1;
            } else {
                return middle; // 猜的数平方以后恰恰好等于输入的数
            }
        }
        return left - 1;
    }
};

参考思路

相关推荐

  1. LeetCode | 数组 | 二分查找 | 69. x 平方根C++】

    2024-04-08 04:56:01       19 阅读
  2. 【题解】leetcode---69. x 平方二分查找入门)

    2024-04-08 04:56:01       36 阅读
  3. 力扣69 x平方根 二分查找平方根 C语言

    2024-04-08 04:56:01       11 阅读
  4. leetcode69 x 平方根

    2024-04-08 04:56:01       31 阅读
  5. 每日OJ题_算法_二分查找③_力扣69. x 平方根

    2024-04-08 04:56:01       38 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-08 04:56:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-08 04:56:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-08 04:56:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-08 04:56:01       20 阅读

热门阅读

  1. 面试算法-138-移动零

    2024-04-08 04:56:01       14 阅读
  2. Kratos 基础学习记录

    2024-04-08 04:56:01       18 阅读
  3. hibernate检索方式

    2024-04-08 04:56:01       18 阅读
  4. 常见的几种字符串及其区别

    2024-04-08 04:56:01       18 阅读
  5. Linux介绍

    2024-04-08 04:56:01       16 阅读
  6. 记录CodeMirror一些常用的配置选项

    2024-04-08 04:56:01       19 阅读
  7. AI创业机会的探索

    2024-04-08 04:56:01       17 阅读
  8. MySQL-对象

    2024-04-08 04:56:01       14 阅读