这两道题都是与二分查找有关的题目,主要用来强化对二分查找的掌握程度,这两道题的思路大致相同,
/**
* @param {number} x
* @return {number}
*/
var mySqrt = function(x) {
var l=1,r=x/2;
while (l<=r)
{
var mid = Math.floor(r+(l-r)/2);
if (mid*mid<x)
{
l=mid+1;
}
else
{
r=mid-1;
}
}
return l * l > x ? l - 1 : l;
};
这是第一题的代码,主体与二分查找相同,主要是找到mid的平方与x最接近的值.得到最接近的值后,因为这里的结果省略了小数,因此得到的l值可能刚好与x相等或略小于x,因此用?表达式可获得最红结果.
/**
* @param {number} num
* @return {boolean}
*/
var isPerfectSquare = function(num) {
var l=1,r=num;
while (l<=r)
{
mid=Math.floor(r+(l-r)/2);
if (mid*mid<=num)
{
l=mid+1
}
else
{
r=mid-1;
}
}
if (mid*mid==num||(mid-1)*(mid-1)==num)
{
return true;
}
else
{
return false;
}
};
这是第二题的代码,主要也是采取了第一题的思路,获得与num的平方根最接近的值,在进行一次判断,如果mid或mid-1的平方与num相等,则可以说明该数字是一个完全平方数.