【leetcode】【c++】69. Sqrt(x)

版权声明:来自 T2777 ,请访问 https://blog.csdn.net/T2777 一起交流进步吧 https://blog.csdn.net/T2777/article/details/87888144

万能的c++ 头文件,以后在进行oj 时可以用,但是 vs 不支持

#include<bits/stdc++.h>

它包含了<iostream><cmath><algorithm>等各种头文件的集合。

INT_MAX = 2147483647 ; INT_MIN =  -2147483648 ; 都是有符号数。

题目描述:

Implement int sqrt(int x).

Compute and return the square root of x, where x is guaranteed to be a non-negative integer.

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: 4
Output: 2

Example 2:

Input: 8
Output: 2
Explanation: The square root of 8 is 2.82842..., and since 
             the decimal part is truncated, 2 is returned.

问题就是模拟 sqrt(), 返回的是 int 型,实际可以用 return (int) sqrt(x) 直接解决。 当然既然是模拟,显然不能用这种方法,这里我们应该用的是二分查找法比较简单,要求根号下的 x ,即求的是某数的平方不大于 x 的最大值。 

class Solution {
public:
    int mySqrt(int x) {
        if(x == 0)
            return 0;
        long long low = 1, high = x;
        //因为可以跳出循环,所以下面不用 <= 
        //当为 == 时实际就是跳出循环
        while( low < high){
            long long mid = (low + high) / 2;
            if(mid * mid == x )
                return (int)mid;
            else if(mid * mid < x){
                low = mid + 1;
            }
            else if(mid * mid > x){
                high = mid - 1;
            }
        }
        //当没有直接mid * mid == x 时才会跳出循环
        //此时最终的值是取平方后结果小于 x 的最大值
        return low * low > x? (int) (low - 1) : (int) low; 
    }
};

因为给的测试例子中有接近于 int 型最大值的数,所以用 long long 型,最后再进行强制转换,long long 型与 int 型之间可以直接进行大小的比较。之所以用的是二分查找,是因为,如果通过 i 从 0 开始递增,直到加到平方不大于 x 的最大整数,会非常的耗费时间,所以直接通过二分查找法较为简单,先从 (x + 1) / 2 开始找起(除了第一种情况否则不可能有 0 ,故 low 从 1 起始)。带入 4 实验后满足条件,当然可能会造成资源的一定浪费,如 [0,...,13, 17,....] x = 177, 当取在 0 到 13 的最小值时实际13就是结果,但仍要在 0 到 13间继续使用二分查找法,但是这种查找是完全必要的。

扫描二维码关注公众号,回复: 5283806 查看本文章

猜你喜欢

转载自blog.csdn.net/T2777/article/details/87888144