攻克代码随想录:贪心算法 | 53. 最大子数组和 | 122. 买卖股票的最佳时机II | 55. 跳跃游戏 | 45. 跳跃游戏 II

53. 最大子数组和

53. 最大子数组和
这是贪心算法的一道较为经典的题。首先,如果数组只有1个数,那么返回该数就可以了。如果数组的长度大于等于2,那我们就要好好讨论了。

这时候,我们先声明几个数,count和largest赋为无限小,而sum赋为0. 从下标为0的数开始遍历,如果sum<0,则continue。如果大于等于0,则继续判断其与count的大小,取其大者赋值给count.而largest则是一直用来判断当前最大的数,用于处理全是负值的数组。

若全是负值,则只用返回largest,除此之外,返回count就可以。

/**
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function(nums) {
    if(nums.length === 1) return nums[0];
    let count = -Infinity;
    let largetst = -Infinity;
    let sum = 0;
    for(let i = 0;i < nums.length;i++){
        largetst = largetst >= nums[i] ? largetst : nums[i];
        sum += nums[i];
        if(sum < 0){
            sum = 0;
            continue;
        }
        count = sum >= count ? sum : count;
    }
    if(count === -Infinity) return largetst;
    return count;
};

122. 买卖股票的最佳时机 II

122. 买卖股票的最佳时机 II
其实这题看上去找不到什么好的解决办法,但是仔细想一想,我们只用将每日交易差做成一个数组,然后将正交易差累加,就是我们的答案了。
(贪心算法很多时候流程不难,但想到方法确实要花一点时间~)

/**
 * @param {number[]} prices
 * @return {number}
 */
var maxProfit = function(prices) {
    let profit = 0;
    for(let i = 0;i < prices.length - 1;i++){
        let minus = prices[i + 1] - prices[i];
        if(minus < 0) continue;
        profit += minus;
    }
    return profit;
};

55. 跳跃游戏

55. 跳跃游戏
对于这题,我们需要运用好声明的cover,通过i + nums[i]与最大覆盖范围进行比较,取其大值赋值给cover。若cover >= nums.length - 1,则return true,否则为false.

/**
 * @param {number[]} nums
 * @return {boolean}
 */
var canJump = function(nums) {
    let cover = 0;
    if(nums.length === 1) return true;
    for(let i  = 0;i <= cover;i++){
        cover = i + nums[i] > cover ? i + nums[i] : cover;
        if(cover >= nums.length - 1) return true;
    }
    return false;
};

45. 跳跃游戏 II

45. 跳跃游戏 II
先声明三个变量cover, step, curCover. 取i + nums[i]与cover的大值给cover。然后进行判定,若i与cover值相同(当前为最大覆盖值),则将step值+1,并将已有的cover赋值给curCover.同时对现在的cover判定,如果已经大于等与最后的下标值,则break并返回,否则继续循环。

/**
 * @param {number[]} nums
 * @return {number}
 */
var jump = function(nums) {
    if(nums.length === 1) return 0;
    let cover = 0;
    let step = 0;
    let curCover = 0;
    for(let i = 0;i < nums.length;i++){
        cover = i + nums[i] > cover ? i + nums[i] : cover;
        if(i === curCover){
            if(curCover !== nums.length - 1){
                step++;
                curCover = cover;
                if(cover >= nums.length - 1) break;
            }
        }
    }
    return step;
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值