leetcode剑指Offer第八天
斐波那契数列
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;
}
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 IT蛋的个人博客!