leetcode69

简单

这道题的核心就是二分法

二分法查找的思路如下:

(1)首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则搜索过程结束,否则执行下一步。

(2)如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤(1)的操作。

(3)如果某一步数组为空,则表示找不到目标元素。

二分法查找的时间复杂度O(logn)。
————————————————
进入到这个题中可以有一个这样的转化.

所求是完成求平方根的动作.比较笨的方法是挨个遍历.

但是明显要耗费很多的时间.

一个数的平方根一定小于他的二分之一

还有一点

x的平方的函数(y=x2)是个单调递增函数

所以采用二分查找可以节省大量的时间.

class Solution {
    public int mySqrt(int x) {
        if(x<2)return x;
        long num;
        //二分法就是移动边界
       int left=2;//左边界
       int right=x/2;//右边界
       int pricot;//平方根
       while(right>=left){//左右节点不装在一起
           pricot=left+(right-left)/2;
           num=(long)pricot*pricot;//如果数字过大pricot会溢出
           if (num>x) right=pricot-1;//
           else if(num<x) left=pricot+1;
           else return pricot;
       }

       return right;
    }
//测试用例
    public static void main(String[] args) {

        Solution solution = new Solution();
        System.out.println( solution.mySqrt(2147395599));
    }
}