当前位置:   article > 正文

【LeetCode-简单】69. x 的平方根 (详解)_69.x的平方根题目程序怎么写

69.x的平方根题目程序怎么写

题目

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

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

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


题目地址:https://leetcode.cn/problems/sqrtx
 

示例

方法1:暴力循环(蠢)

作者:本人

思路:

求开方?那不是很简单,直接从1开始一个一个试呗,谁的平方==x,那就是谁喽。 

  1. class Solution {
  2. public int mySqrt(int x) {
  3. for (int i=1;i<=x;i++){
  4. if (i*i==x)return i;
  5. if (i*i<x && (i+1)*(i+1)>x)return i;
  6. }
  7. return 0;
  8. }
  9. }

提交之后就是失败,因为超时了,因为当x是很大的数字的时候,你一个一个遍历,肯定很费时间。

方法2:二分法

作者:本人

思路:

为了解决超时问题,那我们就用二分法。

最左设置为0,最右设置为x,那中间mid就是 (left+right)/2,如果mid*mid ==x,那就说明找到了结果,如果 <x,那说明中间数mid 太小了,我们放大点,让left移动到mid,反之让right 移动到mid。

一直循环,循环条件是 left必须<right ,还有一种情况是 left 和 right 只相差1,说明真实答案是比left大一点,比right小一点,那就直接返回left即可。

注意

前面我一直是用的 下面这种方式,可是答案就是不通过,提示超时

if (mid * mid == x)return mid;

说明平方有问题,看了网上别人的做法,非常的巧妙,直接将所有的 a * b == c 的模式改成 a == c / b 即可

例如上面就改成

if (mid  ==x/mid)return mid;

答案直接通过

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

 方法3:二分法(完美版)

思路

与方法2一致,比我的更优秀

作者:力扣:Noble Monster

  1. int mySqrt(int x)
  2. {
  3. if(x == 1)
  4. return 1;
  5. int min = 0;
  6. int max = x;
  7. while(max-min>1)
  8. {
  9. int m = (max+min)/2;
  10. if(x/m<m)
  11. max = m;
  12. else
  13. min = m;
  14. }
  15. return min;
  16. }

总结

1. 不要再惦记你那个b暴力循环了,真的很蠢,多想想二分法之类的好方法。

2.为了防止溢出,我们可以用 x/m<m  而不是m*m>x

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/164797
推荐阅读
相关标签
  

闽ICP备14008679号