斐波那契数列

Easy 原题连接:斐波那契数列

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:

F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

示例:

输入:n = 2
输出:1
输入:n = 5
输出:5

限制:

  • 0 <= n <= 100`

解题思路

按照题目要求来,设定好最初的 0 和 1对象,对接下来的递归使用F(N) = F(N-1) + F(N-2)

Java代码

class Solution {
    public int fib(int n) {
        if(n == 0) return 0;
        if(n == 1) return 1;
        int q = 0, p = 1,r = 1;
        for(int i = 2; i<n; i++) {
            q = p;
            p = r;
            r = (q+p)%1000000007;
        }
        return r;
    }
}

青蛙跳台阶问题

Easy 原题连接:青蛙跳台阶问题

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

示例:

输入:n = 2
输出:2
输入:n = 7
输出:21
输入:n = 0
输出:1

提示:

  • 0 <= n <= 100`

解题思路

思路转换一下,其实和上一题是一个意思:

因为青蛙只能一次跳一格或两格,所以考虑青蛙在F( N )最后是跳一格还是两格

如果是跳一格,那就是先跳 F( N-1 )的格子,再跳 1 格

如果是跳两格,那就是线条 F( N-2 )的格子,再跳 2 格

最后一步是固定的,所以F ( N )其实就是 F( N-1 ) + F( N-2 )

Java代码

class Solution {
    public int numWays(int n) {
       if(n==0 || n==1) return 1;
       int pre = 1, prepre = 1, fin = 0;
       for(int i=2; i<=n; i++){
           fin = (pre+prepre)%1000000007;
           prepre = pre;
           pre = fin;
       }
       return fin;
    }
}

股票的最大利润

medium 原题连接:股票的最大利润

假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?

示例:

输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
     注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

限制:

  • 0 <= 数组长度 <= 10^5

解题思路

递归更新数据:最小值,最大差

设定初值为0(没有买入股票),每到一个节点判断是否要更新最小值,判断是否产生了最大值

Java代码

class Solution {
    public int maxProfit(int[] prices) {
        int minPrice = Integer.MAX_VALUE, ans = 0;
        for(int price : prices) {
            minPrice = Math.min(price, minPrice);
            ans = Math.max(ans, price - minPrice);
        }
        return ans;
    }
}