问题入口
二分搜索
最困难的是能否意识到用二分搜索法解题。
算术平方根的区间在[1, x] 。代码如下:
class Solution {
public:
int mySqrt(int x) {
if (x == 1 || x == 0)
{
return x;
}
int64_t start = 1;
int64_t end = x;
while (start <= x)
{
int64_t mid = start + (end - start) / 2;
if (mid * mid < x)
{
if ((mid + 1) * (mid + 1) > x)
return mid;
start = mid + 1;
}
else if(mid * mid > x)
{
if ((mid - 1) * (mid - 1) < x)
return mid - 1;
end = mid - 1;
}
else
return mid;
}
return 0;
}
};
关于时间复杂度
以中间的元素为界,如果大于中间元素,范围限定在右半边,如果小于中间元素,范围限定在左半边。假设数组元素数为n,范围依次是。假设通过k次找到指定元素, 。时间复杂度为O(logn)
溢出
题目要求
#include <cstdint>
#include <iostream>
int main() {
int8_t a = INT8_MAX;
int16_t b = INT16_MAX;
int32_t c = INT32_MAX;
int64_t d = INT64_MAX;
std::cout << "Maximum value of int8_t: " << +a << std::endl;
std::cout << "Maximum value of int16_t: " << b << std::endl;
std::cout << "Maximum value of int32_t: " << c << std::endl;
std::cout << "Maximum value of int64_t: " << d << std::endl;
return 0;
}
假设 mid * mid(中间元素*中间元素) > 214783647,就会引发整数溢出。
所以 这里设置的数据类型是int64_t