这个课题么有专门做过,总觉的急需要总结,又不需要的。
不过,总归是个高频词,不好好搞一下,就算是知识点遗漏了。
455. 分发饼干
860. 柠檬水找零
435. 无重叠区间
思路:题目要求去除区间数量最少,反过来考虑就是尽量保持小区间。用贪心思路,可以这么尝试去搞:对原有区间按照左边界,从小到大排序。在最小的左边界,找到同时最小的右边界。
意思是这样的,但是代码写出来,是另一个相近的更好表达的意思:
按照操作过程理解,当找到一个区间[a1, b1],其上一个区间是 [a0, b0],如果 两个区间不重叠,则有 b0 <= a1,这时不要删除任何空间;反正需要删除 [a1, b1]。这样就能保证 [a0, b0] 一定是从左开始第一个最小子区间。
var eraseOverlapIntervals = function(intervals) {intervals.sort((a, b) => a[0] - b[0]);intervals.sort((a, b) => a[1] - b[1]);let count = 0;let left;let right;for (let i = 0; i < intervals.length; i++) {let [start, end] = intervals[i];if (i === 0) {left = start;right = end;} else {if (right > start) {count++;continue;} else {left = start;right = end;}}}return count;};
逻辑不变,代码优化:
var eraseOverlapIntervals = function(intervals) {intervals.sort((a, b) => a[0] - b[0]);intervals.sort((a, b) => a[1] - b[1]);let count = 0;let left = -Infinity;let right = -Infinity;for (let i = 0; i < intervals.length; i++) {let [start, end] = intervals[i];if (right > start) {count++;continue;} else {left = start;right = end;}}return count;};
https://leetcode-cn.com/circle/article/LUIqgZ/
881. 救生艇
每个船最多两人,求用最少的船?
最贪心的 => 一个船尽量坐两个人 => 优先安排最重的那个
var numRescueBoats = function(people, limit) {let n = people.length;people = people.sort((a, b) => a - b);if (people[n - 1] > limit) {return null; // 船的容量小于最重的人,这活干不了}if (people[0] === limit) { // 优化点return n;}let light = 0;let heavy = n - 1;let result = [];while (light <= heavy) {if (people[light] + people[heavy] <= limit) {result.push([people[light], people[heavy]]);heavy--;light++} else {result.push([people[heavy]]);heavy--;}}return result.length;};
然而,题目优先考虑最轻的人:
如果考虑最重的人,要满足两人之和最大,去分配船。
其实无论从最轻还是最重的人考虑,都是要让人两人体重和最大。而从最轻的人考虑更方便,对于体重轻的人,尽量选择体重最大的人,满足贪心的设定。
