知识点:
1、这道题目用搜索的办法求解sqrt函数,对于复杂的函数均可以用搜索的方式实现。(前提是得到整数解,因为不是整数解无法遍历)
2、对数据边界的考虑,在计算中,尽量不要用乘法。比如要考虑 a*b 和 x的比较关系,转化为a和x/b的比较,这样做避免了a*b可能产生的整数溢出问题。与此同时,产生了新的问题:b必然不能等于0,这个要稍加注意;x/b也会存在向下取整的问题。
3、二叉搜索中一个很重要的函数,rank(int key)
rank(int key)用于搜索,给定的键值key是否存在在数组中,如果存在则返回下标,如果不存在,返回该值应该插入的位置。这一性质很重要。下面的这个实现,避免了递归,只是循环。
对rank()函数的进一步思考:
如果数组中存在与关键值匹配的内容,一定会在while循环里面执行“else return mid;”;如果没有满足,因为 i<=j 条件不满足跳出了循环,那么对于跳出的值 i,j,其判断语句
if (data[mid] > key) j = mid - 1;
else if (data[mid] < key) i = mid + 1;
均是不满足的,也就是
data[j]<= key
data[i]>= key
int data[len] = {.......};//升序
int rank(int k)
{
int i = 0;
int j = len - 1;
int mid;
while (i <= j) //注意这是<=,必须包含等于的情况
{
mid = (j - i) / 2 + i;
if (data[mid] > key) j = mid - 1;
else if (data[mid] < key) i = mid + 1;
else return mid;
}
return i;
}
题目:
Implement int sqrt(int x).
Compute and return the square root of x.
class Solution {
public:
int mySqrt(int x) {
if(x==0) return 0;
int i=1;
int j=x;
int mid;
while(i<=j)
{
mid=(j-i)/2+i;
if(mid>x/mid) j=mid-1;
else if(mid<x/mid) i=mid+1;
else return mid;
}
if(i==x/i) return i;
else return i-1;
}
};