当前位置: 首页 > article >正文

LeetCode 69.x的平方根

题目描述

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

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

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

示例 1:

输入:x = 4
输出:2

示例 2:

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

提示:

  • 0 <= x <= 2^31 - 1

思路

由于非负整数的平方属于有序数组且各不相同,本题可以使用二分查找,在1与x这个区间内进行查找。由于结果不可能是x本身,所以查找区间可以是[1,x),笔者选择使用左闭右开式二分查找的写法。

也可以观察规律,当某个数i的平方恰好大于x时,那么这个数减1就是x算术平方根的整数部分,例如8的算术平方根是2√22<2√2<3,2√2的整数部分正好是2,但是这种方法效率较低。

代码

C++版:

方法一:

class Solution {
public:
    int mySqrt(int x) {
        for(int i=1;;i++){
            // 使用x/i<i能够防止i*i溢出
            if(x/i<i){
                return i-1;
            }
        }
    }
};

方法二:

class Solution {
public:
    int mySqrt(int x) {
        //剪枝
        if(x<=1){
            return x;
        }
        // 所找结果一定在0与x之间,可使用二分查找
        int left=1;
        int right=x;
        while(left<right){
            int middle=left+(right-left)/2;
            if(x/middle<middle){
                right=middle;
            }
            else if(x/middle>middle){
                left=middle+1;
            }
            else{
                return middle;
            }
        }
        return left-1;
    }
};

Python版:

方法一:

class Solution:
    def mySqrt(self, x: int) -> int:
        if x<=1 :
            return x
        i=1
        while True :
            if x//i<i:
                return i-1
            i+=1

方法二:

class Solution:
    def mySqrt(self, x: int) -> int:
        if x<=1 :
            return x
        left=1
        right=x
        while left<right:
            middle = left+(right-left)//2
            if x//middle<middle:
                right=middle
            elif x//middle>middle:
                left=middle+1
            else:
                return middle
        return left-1

需要注意的地方

1.注意不能直接比较middle*middle<x,因为int*int可能会溢出。


http://www.kler.cn/a/298418.html

相关文章:

  • 2024数学建模国赛A题详细思路:基于空间几何运动学和优化模型matlab求解
  • ollama 本地部署
  • Linux下载压缩包:tar.gz、zip、tar.bz2格式全攻略
  • 从学习到的因果网络中估计因果效应
  • Python复制数组并增加一个维度
  • FPGA状态机编程示例
  • 如何使用智能合约铸造 NFT —— 以 NftMarket 合约为例
  • 第L8周:机器学习|K-means聚类算法
  • 谷歌浏览器ChromeDriver 128,129,130驱动下载
  • 零知识证明-ZK-SNARKs基础(七)
  • 力扣100题——二分查找
  • Mysql数据量大,如何拆分Mysql数据库(垂直拆分)
  • 代码随想录27期|Python|Day51|​动态规划|​115.不同的子序列|​583. 两个字符串的删除操作​|
  • 【机器人工具箱Robotics Toolbox开发笔记(九)】 机器人逆运动学分析
  • 基于单片机的水产养殖饲料自动投喂系统
  • (9月10日)最新植物大战僵尸杂交版【v2.4.0版本已更新】
  • Kafka的三高设计原理
  • C# 基础巩固 详解 匿名方法、lambda表达式和Action关键字
  • 前端:JavaScript 实现类
  • Vue 3中的组件是如何渲染的