贪心 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 (亚马逊、华为、字节跳动在半年内面试中考过)
