• leetcode每日一题(2020-05-09):69.x的平方根


    题目描述:实现 int sqrt(int x) 函数。

    计算并返回 x 的平方根,其中 x 是非负整数。

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

    今日学习:
    1.复习二分法
    2.加一个感悟 同样是二分法 细节是魔鬼

    题解1:首先肯定是自带的函数

    var mySqrt = function(x) {
          return Math.floor(Math.sqrt(x));
    }
    

    题解2:我自己想的二分法,因为大于4的x其实只需要将end设置为Math.ceil(x/2)就可以了,我觉得可以节省时间,【写博客的时候想到,这不过是少了一次二分而已,一一好像不是很大】

    var mySqrt = function(x) {
          if(x == 0 || x < 1){return 0;}
          if(x >= 1 && x < 4){return 1;}
          if(x == 4){return 2;}
          else{
                var start = 0;
                var end = Math.ceil(x / 2);
                var mid = (start + end) >> 1;
                while(start != end - 1){
                      if(mid * mid == x){return mid;}
                      if(mid * mid > x){
                            end = mid;
                            mid = (start + end) >> 1;
                      }else{
                            start = mid;
                            mid = (start + end) >> 1;
                      }
               }
          }
          return start;
    };
    

    题解3:别人的二分法,这样可以减少查找次数(真实的减少hhh,因为判断条件的缘故不用执行那么多循环次数)

    //参考别人的二分法
    var mySqrt = function(x) {
        if(x === 0) return 0;
        var start = 0, end = x;
        var i = (start + end) >> 1;
        while(i < x){
           i = (start + end) >> 1;
            if(i * i === x) return i;
            if(start === end - 1) break;
            if(i * i > x) end = i;
            else start = i;
        }
        if(start * start <= x && end * end > x) return start;
        return end;
    };
    

    题解4:2和3结合:

    //结合到一起的二分法
    var mySqrt = function(x) {
        if(x == 0 || x < 1){return 0;}
        if(x >= 1 && x < 4){return 1;}
        if(x == 4){return 2;}
        var start = 0, end = Math.ceil(x / 2);
        var mid = (start + end) >> 1;
        while(mid < Math.ceil(x / 2)){
            mid = (start + end) >> 1;
            if(mid * mid === x) return mid;
            if(start === end - 1) break;
            if(mid * mid > x) end = mid;
            else start = mid;
        }
        if(start * start <= x && end * end > x) return start;
        return end;
    };
    

    题解5:

    var mySqrt = function(x) {
        if(x == 0 || x ==1){
            return x;
        }
        var left = 1;
        var right = x;
        while(left <= right){
           var middle = left + ((right-left)>>1);
           if(middle*middle == x){
               return middle;
           }else if(middle*middle > x){
               right = middle-1;
           }else{
               left = middle+1;
           }
        }
        return right;
    };
    

    题解6:

    var mySqrt = function(x) {
        if(x == 0 || x < 1){return 0;}
        if(x >= 1 && x < 4){return 1;}
        if(x == 4){return 2;}
        else{
            var start = 2;
            var end = Math.ceil(x / 2);
            while(start <= end){
                var mid = (start + end) >> 1;
                if(mid * mid == x){return mid;}
                if(mid * mid > x){
                    end = mid - 1;
                }else{
                    start = mid + 1;
                }
            }
        }
        return end;
    };
    
  • 相关阅读:
    模块二 GO语言进阶技术-panic函数、recover函数以及defer语句(上)
    模块二 GO语言进阶技术-错误处理(下)
    模块二 GO语言进阶技术-错误处理(上)
    模块二 GO语言进阶技术-if语句、for语句和switch语句
    模块二 GO语言进阶技术-GO语句及其执行规则(下)
    模块二 GO语言进阶技术-go语句及其执行规则(上)
    模块二 GO语言进阶技术-关于指针的有限操作
    模块二 GO语言进阶技术-接口类型的合理运用
    模块二 GO语言进阶技术-结构体及其方法的使用法门
    模块二 GO语言进阶技术-使用函数的正确姿势
  • 原文地址:https://www.cnblogs.com/autumn-starrysky/p/12860211.html
Copyright © 2020-2023  润新知