①x的平方根
实现 int sqrt(int x)
函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4 输出: 2
示例 2:
输入: 8 输出: 2 说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
原本打算采用暴力解法,结果超时。。。
1.采用二分搜索法寻找平方根:
class Solution {
public:
int mySqrt(int x) {
if (x <= 1) return x;
int left = 0, right = x;
while (left < right) {
int mid = left + (right - left) / 2; //设定中值
if (x / mid >= mid) left = mid + 1; //如果中值平方小于x,则将中值+1赋給左值,继续求中值
else right = mid; //否则将中值赋給右值,继续求中值
}
return right - 1; //得出结果为右值-1
}
};
2.用牛顿迭代法,可以参考下大佬Annie Kim's Blog的博客
因为要求x2 = n的解,令f(x)=x2-n,相当于求解f(x)=0的解,可以求出递推式如下:
xi+1=xi - (xi^2 - n) / (2xi) = xi - xi / 2 + n / (2xi) = xi / 2 + n / (2xi) = (xi + n/xi) / 2
class Solution {
public:
int mySqrt(int x) {
if (x == 0) return 0;
double res = 1, pre = 0;
while (abs(res - pre) > 1e-6) {
pre = res;
res = (res + x / res) / 2;
}
return int(res);
}
};
②爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶。 1. 1 阶 + 1 阶 2. 2 阶
示例 2:
输入: 3 输出: 3 解释: 有三种方法可以爬到楼顶。 1. 1 阶 + 1 阶 + 1 阶 2. 1 阶 + 2 阶 3. 2 阶 + 1 阶
1.采用递归,但时间超时:
class Solution {
public:
int climbStairs(int n) {
if (n == 1)
return 1;
if (n == 2)
return 2;
return climbStairs(n-1) + climbStairs(n-2);
}
};
2.将从1到n的所有走法用容器存储起来,然后返回得到n阶楼梯的走法:
class Solution {
public:
int climbStairs(int n) {
vector<int> a(n+1);
if (n == 1)
return 1;
if (n == 2)
return 2;
a[0] = 1;
a[1] = 2;
for (int i = 2;i < n; ++i)
{
a[i] = a[i - 1] + a[i - 2]; //递推得到当前阶梯数目下的走法
}
return a[n - 1];
}
};