69. Sqrt(x)leetcode

69. Sqrt(x)

问题描述:Given a non-negative integer x, compute and return the square root of x.

Since the return type is an integer, the decimal digits are truncated, and only the integer part of the result is returned.

Example 1:
Input: x = 4
Output: 2
Example 2:
Input: x = 8
Output: 2
Explanation: The square root of 8 is 2.82842…, and since the decimal part is truncated, 2 is returned.

两种方法解题:
1.二分搜索法
2.牛顿迭代法

1.二分搜索法

注意这种方法有四个地方:
第一处是 right 的初始化。

第二处是 left 和 right 的关系,可以写成 left < right 或者 left <= right。

第三处是更新 right 的赋值,可以写成 right = mid 或者 right = mid - 1。

第四处是最后返回值,可以返回 left,right,或 right - 1。

但是这些不同的写法并不能随机的组合,像博主的那种写法,若 right 初始化为了 nums.size(),num为数组,那么就必须用 left < right,而最后的 right 的赋值必须用 right = mid。但是如果我们 right 初始化为 nums.size() - 1,那么就必须用 left <= right,并且right的赋值要写成 right = mid - 1,不然就会出错。所以博主的建议是选择一套自己喜欢的写法,并且记住,实在不行就带简单的例子来一步一步执行,确定正确的写法也行。

int mySqrt1(int x){
        if(x <= 1) return x;
        int left = 0;
        int right = x;
        while(left <= right)
        {
            int mid = left + (right - left)/2;
            if(mid == x/mid)return mid;
            if(mid < x/mid){
                left = mid+1;
            }else{
                right = mid-1;
            }
        }
        return right;

    }

2.牛顿迭代法

就记住公式,直接代入就行,不理解牛顿迭代法的,可以看这个:
https://blog.csdn.net/yymm120/article/details/105472489?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522160756825019725271096789%252522%25252C%252522scm%252522%25253A%25252220140713.130102334…%252522%25257D&request_id=160756825019725271096789&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-2-105472489.nonecase&utm_term=%E7%89%9B%E9%A1%BF%E8%BF%AD%E4%BB%A3%E6%B3%95

int mySqrt(int x){
        if(x<=1) return x;
        int re = x;
        while(re*re > x)
        {
            re = (x/re + re)/2;
        }
        return re;

    }

你可能感兴趣的:(leetcode,leetcode)