• leetcode:69. x 的平方根


    一、题目

    函数原型:int mySqrt(int x)

    二、思路

            利用二分查找思想,在0与x区间进行查找。

            设置左边界 left (初始值为0),右边界 right(初始值为x)和中值 mid (值为区间的中间值),同时设置一个ans(初始值为-1)作为最终返回值。

            设置循环,循环条件为 left<=right。每次进入循环,通过中值mid的平方与x进行比较确定x的平方根在中值左区间还是右区间或是mid即为x的平方根。mid平方小于x则说明平方根在中值左区间,大于x则说明平方根在中值右区间。

            每次进入循环,先更新一下mid的值,然后再进行比较判断确定平方根所在区间。将平方根在左区间和平方根刚好等于mid的情况合并。如果平方根在左区间或平方根刚好等于mid,则更新区间并将mid的值赋值给ans;如果平方根在右区间,则只更新区间。

    最终循环结束后,返回ans。

    关键1:中值mid值如何求?

    mid = left +(right - left)/ 2

    关键2:为什么循环条件是 left<=right ?

    只有当left <= right 时,才能保证要求的平方根在区间内。left = right 时也算一个区间,只不过该区间只有一个值。

    关键3:为什么只有当mid的平方小于等于x时才将mid的值赋给ans?

    当mid的平方等于x时,将mid的值赋给ans毋庸置疑。当mid的平方小于x时,将mid的值赋给ans,是因为在循环中可能会出现所求平方根的精确值在两个相邻整数之间,此时mid的值时较小的整数,我们要求的粗略值也是较小的整数,因此mid的值就是我们要求的ans值。

    关键4:为什么mid的平方需要强制类型转换?

    因为题目提示部分显示x<=2^31-1,数据较大,int类型可能能存放不下,需要用long long类型存储。

    1. int mySqrt(int x)
    2. {
    3. int left = 0;
    4. int right = x;
    5. int mid = left + (right - left) / 2;
    6. int ans = -1;
    7. while (left <= right)
    8. {
    9. mid = left + (right - left) / 2;
    10. if ((long long)mid * mid <= x )
    11. {
    12. left = mid + 1;
    13. ans = mid;
    14. }
    15. else if ((long long)mid * mid > x )
    16. {
    17. right = mid - 1;
    18. }
    19. }
    20. return ans;
    21. }

  • 相关阅读:
    C++ shared_ptr类型转换的实现原理与type traits类型萃取
    明道云在艾默生数字化实践的新进展
    全自动打包机检测不到货物怎么办?
    机器学习算法-集成学习
    船舶单独安装的双频GNSS的PPP解算
    计算机毕业设计springboot+vue基本微信小程序的快递收发小程序
    微信小程序备案流程操作详解,值得收藏
    如何在 Java 中使用 MQTT
    Windows 实时语音转文字|免费语音视频翻译转文字|语音会议记录方案
    PDMS-100型压电材料摩擦纳米发电机测试系统
  • 原文地址:https://blog.csdn.net/2301_76197086/article/details/132866942