基本定义
每次操作都是局部最优(近似最优解)的(每次操作不考虑全局最优),从而使最后得到的结果是全局最优的。
难点是如何证明贪心是正确的,并且贪心没有固定的模板。
分配问题
题目: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
};