剑指Offer第八天
动态规划,这天都是很简单的题。。
题1:斐波那契数列
写一个函数,输入
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。
class Solution {
public int fib(int n) {
if(n==0){return 0;}
int[] dp = new int[n+1];
dp[1] = 1;
for(int i = 2; i <= n; i++){
dp[i] = (dp[i-1] + dp[i-2]) % 1000000007;
}
return dp[n];
}
}
题2:青蛙跳台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
/**
* 青蛙如果想要到台阶四,只有两个方法能到
* 1:从第三个台阶跳一步上去 dp[n] 取决于dp[n-1]
* 2: 从第二个台阶跳两格上去 dp[n] 也取决于dp[n-2]
* 所以关系就是,你不知道青蛙咋跳的,都有可能就取和
* dp[n] = dp[n-1] + dp[n-2]
* 斐波那契换个说法。。。
**/
class Solution {
public int numWays(int n) {
if(n==0){return 1;}
int[] dp = new int[n+1];
dp[0] = 1;
dp[1] = 1;
for(int i = 2; i <= n; i++){
dp[i] = (dp[i-1] + dp[i-2]) % 1000000007;
}
return dp[n];
}
}
题3:股票的最大利润
假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?
class Solution {
public int maxProfit(int[] prices) {
//只能买卖一次,所以
int length = prices.length;
//minValue找出数组的最小值
int minValue = Integer.MAX_VALUE;
//maxPro输出的利润值
int maxPro = 0;
for(int i = 0; i < length; i++){
//利润就是当前价格减去最低价格
//如果理论大于迄今的最大理论,就替换,否则就不变
maxPro = (prices[i] - minValue) > maxPro ? (prices[i] - minValue):maxPro;
//更新最低价格
minValue = Math.min(prices[i], minValue);
}
return maxPro;
}
}