万能的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: 2Example 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间继续使用二分查找法,但是这种查找是完全必要的。