问题
还需要继续学习,以前的知识点都忘了
剑指 Offer 10- I. 斐波那契数列
写一个函数,输入 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。特别要注意的就是此处,每次迭代都需要计算,不能放到最后再计算
题意分析 fn(0) = 0 fn(1) = 1 fn(n) = fn(n-2) + fn(n-1) n>=2, 即后一个数等于前两个数之和
function fib(n) {
const MOD = 1000000007;
if (n < 2) return n;
let left = 0,
right = 1,
sum = 0;
for (let i = 1; i < n; i++) {
sum = left + right;
left = right
right = sum
}
return sum % MOD;
}
剑指 Offer 10- II. 青蛙跳台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
解题思路 列出几种 就可以找出规律 和动态规划相同
function numWays(n) {
if (n <= 1) return 1;
const MOD = 1000000007;
let left = 1,
right = 1,
sum = 0;
for (let i = 1; i < n; i++) {
sum = (left + right) % MOD;
left = right
right = sum
}
return sum;
}
剑指 Offer 63. 股票的最大利润
假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?
解题思路 找出最大利润,及后面的减去前面的值的最大值 动态规划
- 遍历数组,申明两个变量,一个用来存取当前的最大利润,一个用来存取最小值
- 最大利润 = max(当前值 - 最小值,最大利润)
- 最小值则 = min(最小值,当前值)
- 返回最大利润
function maxProfit(prices) {
let minprice = Number.MAX_VALUE;
let maxprofit = 0;
for (const price of prices) {
maxprofit = Math.max(price - minprice, maxprofit);
minprice = Math.min(price, minprice);
console.log(price, maxprofit, minprice);
}
return maxprofit;
// 暴力破解 不推荐
// if (prices.length < 2) return 0;
// let sum = 0;
// for (let i = 0; i < prices.length - 1; i++) {
// for (let j = i + 1; j < prices.length; j++) {
// if (prices[j] - prices[i] > sum) {
// sum = prices[j] - prices[i]
// }
// }
// }
// return sum
}