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

每日一练:二分查找-x的平方根

LCR 072. x 的平方根 - 力扣(LeetCode)

题目要求:

给定一个非负整数 x ,计算并返回 x 的平方根,即实现 int sqrt(int x) 函数。

正数的平方根有两个,只输出其中的正数平方根。

如果平方根不是整数,输出只保留整数的部分,小数部分将被舍去。

示例 1:

输入: x = 4
输出: 2

示例 2:

输入: x = 8
输出: 2
解释: 8 的平方根是 2.82842...,由于小数部分将被舍去,所以返回 2

提示:

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

暴力破解 O(N):

        从0枚举到x,只要发现某个数 i 的平方小于等于x,并且 i+1 的平方大于x,那么 i 就是平方根。

class Solution {
public:
    int mySqrt(int x) {
        for(long long i = 0;i < x;i++){
            if(i*i<=x && (i+1)*(i+1)>x)
                return i;
        }
        return x;
    }
};

二分查找(查找左端点) O(LogN):

        暴力破解中可以发现,如果x是8,那么结果2可以把数组分成左边:平方和小于8的部分和右边:平方和大于8的部分,可知数组具有二段性,所以可以使用二分查找。

        又因为可以舍去小数部分,即结果的平方和可能小于或者等于x,所以查找较小的左端点。

        注意:

        mid的平方可能大于INT_MAX,,所以用long long接收;

        因为查找的是左端点,对于偶数个数组,以中间偏右的元素为mid,否则left=mid可能造成死循环。

class Solution {
public:
    int mySqrt(int x) {
        int left = 0,right = x;
        while(left<right){
            long long mid = left+((long long)right-left+1)/2;
            if(mid*mid<x)
                left=mid;
            else if(mid*mid>x)
                right=mid-1;
            else // 优化:如果已经等于x,就不需要再找了
                return mid;
        }
        return left;
    }
};

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

相关文章:

  • 【Golang】Channel的ring buffer实现
  • 读数据质量管理:数据可靠性与数据质量问题解决之道03数据目录
  • 【日志】392.判断子序列
  • 深入剖析【C++继承】:单一继承与多重继承的策略与实践,解锁代码复用和多态的编程精髓,迈向高级C++编程之旅
  • 问:MySQL主从同步的机制梳理?
  • [ Linux 命令基础 3 ] Linux 命令详解-文件和目录管理命令
  • Unity3D学习FPS游戏(11)敌人AI巡逻(NavMesh)
  • C++多态及其在设计模式中的作用举例
  • 【webrtc】 RTP 中的 MID(Media Stream Identifier)
  • Spring Boot编程训练系统:构建企业级应用
  • 基于BILSTM及其他RNN序列模型的人名分类器
  • 革新农业未来!Dimitra生态币价双双腾飞在即
  • AI 大模型在软件开发中的角色
  • IntelliJ IDEA 启动报 Unsupported Java Version
  • HTTP 客户端怎么向 Spring Cloud Sleuth 传输跟踪 ID
  • 彻底理解ARXML中的PDU
  • 我们的第2个原创项目上线啦
  • ubuntu20.04 解决Pytorch默认安装CPU版本的问题
  • 生成S19(SRecord)的数据段Hash/AES/RSA
  • python练习-Django web入门
  • 【计算机网络】设备网卡NIC的工作内容有哪些呢?
  • python+pptx:(三)添加统计图、删除指定页
  • rust构建web服务器
  • Linux终端命令后台运行
  • spring中r类是什么
  • ubuntu下的一些常用指令