解題思路
題目要求的是x的平方根,且只保留整數的部分,小數部分都被捨去
以x=8爲例,題目是 求最後1個小於2.828的正整數
這屬於“尋找有序序列中第一個滿足某條件的元素的位置”中的一類題目(所要求的的正整數就是位置),如果想要尋找最後一個滿足“條件C”的元素的位置,則可以先求第一個滿足“條件!C”的元素的位置,然後將該位置減1即可。
因此題目就變爲了 求第一個大於2.828的正整數 ,套用“求序列中第一個大於x的元素的位置”的二分查找模板即可
代碼
class Solution {
public:
int mySqrt(int x) {
if (x < 2) return x;//特殊情況
int left = 1;
int right = x;
while (left < right)
{
long long mid = left + (right - left) / 2;//使用長整數,之後相乘有可能出現溢出
if (mid*mid>x)//說明第一個大於x的位置一定在mid處或mid的左側
{
right = mid;//往左子區間[left,mid]查找
}
else//說明第一個大於等於x的元素的位置一定在mid+1處或mid+1的右側
{
left = mid + 1;//往右子區間[mid+1,right]查找
}
}
return left-1;//返回夾出來的位置
}
};