贪心算法学习笔记

基本定义

每次操作都是局部最优(近似最优解)的(每次操作不考虑全局最优),从而使最后得到的结果是全局最优的。

难点是如何证明贪心是正确的,并且贪心没有固定的模板。

分配问题

题目:https://leetcode-cn.com/problems/assign-cookies/
题解

因为饥饿度最小的孩子最容易吃饱,所以我们先考虑这个孩子。为了尽量使得剩下的饼干可以满足饥饿度更大的孩子,所以把大于等于这个孩子饥饿度的、且大小最小的饼干给这个孩子。满足了这个孩子之后,我们采取相同的策略,考虑剩下孩子里饥饿度最小的孩子。直到没有满足条件的饼干。

/**
 * @param {number[]} g
 * @param {number[]} s
 * @return {number}
 */
var findContentChildren = function (g, s) {
  function compare(value1, value2) {
    if (value1 > value2) {
      return 1;
    } else if (value1 < value2) {
      return -1;
    } else {
      return 0;
    }
  }
  g.sort(compare);
  s.sort(compare);

  let contentTotal = 0;
  let curChild = 0;
  s.forEach((item, index, array) => {
    if (item >= g[curChild]) {
      contentTotal++;
      curChild++;
    }//if
  });
  return contentTotal;
};


findContentChildren([1,2,3], [1,1])

区间问题

题目:https://leetcode-cn.com/problems/non-overlapping-intervals/
题解:

在选择要保留区间时,区间的结尾十分重要:选择的区间结尾越小,留给其他区间的空间就越大,就越能保留更多的区间。

因此,我们采取的贪心策略为,优先保留结尾小且不相加的区间。

/**
 * @param {number[][]} intervals
 * @return {number}
 */
var eraseOverlapIntervals = function (intervals) {
  function compare(value1, value2) {
    if (value1[1] > value2[1]) {
      return 1;
    } else if (value1[1] < value2[1]) {
      return -1;
    } else {
      return 0;
    }
  }
  intervals.sort(compare)
  let eraseNum = 0
  let lastMinEnd = -Infinity

  intervals.forEach((item, index, array) => {
    if (item[0] < lastMinEnd) {
      eraseNum++
    }//if
    else {
      lastMinEnd = item[1]
    }
  });
  return eraseNum
};

// console.log(eraseOverlapIntervals([[1,2],[2,3],[3,4],[1,3]]));

买卖股票的最佳时机

题目:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/
题解:

贪心思想在于,如果今天买明天卖可以赚钱,那就买入。

/**
 * @param {number[]} prices
 * @return {number}
 */
var maxProfit = function (prices) {
  let maxProfit = 0
  prices.forEach((item, index, array) => {
    if (index !== 0) {
      if (item > array[index - 1]) {
        maxProfit += item - array[index - 1]
      }
    }
  });
  return maxProfit
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值