贪心 VS 回溯 VS 动态规划
贪心:当下做局部最优的选择, 不能够回退
贪心算法 在每一步总是做出在当前看来最好的选择 ==> 着眼于当下
参考链接
- coin change 题目
-
课后作业
[x] 柠檬水找零(亚马逊在半年内面试中考过)
var lemonadeChange = function (bills) {
/**
* 如果遍历10, 则数组中减少一个5
* 如果遍历到20, 则数组中减少 10,5 或者 3个5
*/
let five = 0,
ten = 0,
twenty = 0;
for (let index = 0; index < bills.length; index++) {
const element = bills[index];
if (element === 5) {
five++;
}
if (element === 10) {
if (five >= 1) {
five--;
ten++;
} else {
return false;
}
}
if (element === 20) {
if (five >= 1 && ten >= 1) {
five--;
ten--;
} else if (five >= 3) {
five -= 3;
twenty++;
} else {
return false;
}
}
}
return true;
};
[x] 买卖股票的最佳时机 II (亚马逊、字节跳动、微软在半年内面试中考过)
/**
* 贪心:只关心当前局部最优解
* 1、遍历 prices, 如果 prices[i+1] > prices[i] 卖出股票
* 2、累加差值
*/
var maxProfit = function(prices) {
let res = 0;
for(let i=0; i<prices.length; i++){
if( prices[i+1] > prices[i]){
let diff = prices[i+1] - prices[i]
res+=diff;
}
}
return res;
};
[x] 分发饼干(亚马逊在半年内面试中考过)
/**
* 1、将饼干s 和小孩g 按照从小到大的顺序排列
* 2、反向遍历小孩,如果 s[i] >= g[i] res +=1, sIndex--
* 3、注意点:只需要O(n)的时间复杂度,只需要遍历小孩数组即可
*/
var findContentChildren = function (g, s) {
g.sort((a, b) => {
return a - b;
});
s.sort((a, b) => {
return a - b;
});
let res = 0;
let sIndex = s.length - 1; // 维护一个饼干的序列,避免嵌套循环降低复杂度
for (let i = s.length - 1; i >= 0; i--) {
if (s[sIndex] >= 0 && s[sIndex] >= g[i]) {
res += 1;
sIndex--;
}
}
return res;
};
[ ] 模拟行走机器人
- 跳跃游戏 (亚马逊、华为、Facebook 在半年内面试中考过)
- 跳跃游戏 II (亚马逊、华为、字节跳动在半年内面试中考过)