12.20 LeetCode(剑指offer)

65 阅读1分钟

10.I斐波那契数列

//其实可以将matrix的最大值设为n。
var fib = function(n) {
    let matrix = [];
    matrix.push(0);
    matrix.push(1);
    for(let i = 2;i<=100;i++){
    //for(let i = 2;i<=n;i++){
        matrix.push((matrix[i-1]+matrix[i-2])%(1e9+7));
    }
    return matrix[n];
};

10.II青蛙跳台阶问题

//斐波那契数列也可以改成这种写法,不需要借用数组。
var numWays = function(n) {
    if(n<2) return 1;
    let pre = 0;
    let cur = 1;
    let res = pre+cur;
    while(n--){
        res = (pre+cur)%(1e9+7);
        pre = cur;
        cur = res;
    }
    return res;
};

63.股票的最大利润

var maxProfit = function(prices) {
    if(prices.length<=1) return 0;
    let minPrice = prices[0];
    let maxProfit = Number.MIN_SAFE_INTEGER;
    for(let i =1;i<prices.length;i++){
        minPrice = Math.min(minPrice,prices[i]);
        maxProfit = Math.max(maxProfit, prices[i]-minPrice);
    }
    return maxProfit>0?maxProfit:0;
};

42.连续子数组的最大和

//再写十遍还是不记得...pre一定是连续的,max就是连续的最大值。
var maxSubArray = function(nums) {
    let max = nums[0];
    let pre = nums[0];
    for(let i =1;i<nums.length;i++){
        pre = Math.max(pre+nums[i], nums[i]);
        max = Math.max(pre, max);
    }
    return max;
};

47.礼物的最大价值

var maxValue = function(grid) {
    let m = grid.length;
    if(!m) return 0;
    let n = grid[0].length;
    if(!n) return 0;
    let res = Array(m+1).fill(Array(n+1).fill(0));
    for(let i = 1;i<=m;i++){
        for(let j =1;j<=n;j++){
            res[i][j] = Math.max(res[i][j-1],res[i-1][j])+grid[i-1][j-1];
        }
    }
    return res[m][n];
};