贪心算法(力扣hot)

143 阅读1分钟

力扣对应的贪心算法共4题

力扣121.买卖股票的最佳时机

解题思路:因为只能买卖一次,取最左最小值,最右最大值的最大差值就是最大利润

/**
 * @param {number[]} prices
 * @return {number}
 */

const maxProfit=(prices)=>{
    let res = 0;
    let minPrice = prices[0];
    for(let i = 0;i<prices.length;i++){
        res = Math.max(res,prices[i]-minPrice);
        minPrice = Math.min(minPrice,price[i])
    }
    return res
}

力扣55.跳跃游戏

解题思路:判断能否跳到最后,需要判断每一个位置累计的最大范围是否包含最后一位

/**
 * @param {number[]} nums
 * @return {boolean}
 */

const canJump=(nums)=>{
    if(nums.length === 1) return true;
    let cover = 0;
    for(let i=0;i<=cover;i++){
        cover = Math.max(cover,i+nums[i]);
        if(cover>=nums.length-1) return true
    }
    return false
}

力扣45.跳跃游戏II

解题思路:最少步数其实就是累计到达最大区间的次数

/**
 * @param {number[]} nums
 * @return {boolean}
 */

const jump=(nums)=>{
    let steps = 0;
    let cover = 0;
    let current = 0;
    for(let i=0;i<nums.length;i++){
        cover = Math.max(cover,i+nums[i]);
        if(i === current){
            step++;
            current = cover
        }
    }
    return steps
}

力扣763.划分字母区间

解题思路:需要记录每个字符的出现的最远位置,遍历整个字符串,不断更新最远距离,如果当前位置等于最远位置,就是一个字母区间。记录这个位置,继续片遍历,继续切割

/**
 * @param {string} s
 * @return {number[]}
 */
const partitionLabels=(s)=>{
    const maxPos = {};
    //记录每个字母的最远位置
    for(let i = 0;i<s.length;i++){
        maxPos[s[i]] = i
    }
    let res = [];  //存储字母区间长度
    let start = 0; //切割的起始位置
    let canSlibPos = 0; //最远位置
    
    for(let i = 0;i<s.length;i++){
        canSlibPos = Math.max(canSlibPos,maxPos[s[i]]); //更新最远位置
        if(i == canSlibPos){ //到达切割点
            res.push(i-start+1);
            start = i + 1;  //更新切割的起始位置
        }
    }
    return res
}