初识Leetcode----学习(八)【x的平方根、爬楼梯】

x的平方根

实现 int sqrt(int 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];
    }
};

猜你喜欢

转载自blog.csdn.net/qq_38790716/article/details/83038431