知识点:
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; } };