【前端er每日算法】贪心算法三题

107 阅读1分钟

题目一 455. 分发饼干

思路

两个数组排序,然后遍历饼干数组,如果当前满足胃口,则胃口+1,否则不动,result记录

var findContentChildren = function(g, s) {
    g.sort((a, b) => a - b);
    s.sort((a, b) => a - b);
    let gIndex = 0;
    for (let i = 0; i < s.length; i++) {
        if (s[i] >= g[gIndex]) {
            gIndex++;
        }
    }
    return gIndex;
};

题目二 376. 摆动序列

思路

遍历元素,记录前面两个数之差,以及当前两个数之差,如果pre <= 0 && cur > 0 说明遇到了波峰,结果+1,并将prediff进行更新

/**
 * https://leetcode.cn/problems/wiggle-subsequence/
 * @param {*} nums 
 * @returns 
 */
var wiggleMaxLength = function(nums) {
    let result = 0;
    let preDiff = 0;
    let curDiff = 0;
    let len = nums.length;
    if (len <= 2) {
        return len;
    }
    for (let i = 0; i < nums.length; i++) {
        curDiff = nums[i+1] - nums[i];
        if ((preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)) {
            result++;
            preDiff = curDiff;
        }
    }
    return result + 1;
};

题目三 53. 最大子数组和

思路

遍历数组,记录当前元素相当后的和,如果相加之后小于0,则sum重0开始计数,遍历过程中记录sum的最大值。

局部最优解:局部和最大,遇到小于0了就清0,并且记录遍历路程中的最大和

/**
 * https://leetcode.cn/problems/maximum-subarray/
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function(nums) {
    let result = Number.MIN_SAFE_INTEGER;
    let sum = 0;
    for (let i = 0; i < nums.length; i++) {
        sum += nums[i];
        if (sum > result) {
            result = sum;
        }
        if (sum < 0) {
            sum = 0;
        }
    }
    return result;
};