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));
}
}