今天的三道題目,都算是 重疊區間 問題,大家可以好好感受一下。 都屬於那種看起來好複雜,但一看貪心解法,驚呼:這麼巧妙!
這種題還是屬於那種,做過了也就會了,沒做過就很難想出來。
不過大家把如下三題做了之後, 重疊區間 基本上差不多了
- 用最少數量的箭引爆氣球
https://programmercarl.com/0452.用最少數量的箭引爆氣球.html
/**
* @param {number[][]} points
* @return {number}
*/
var findMinArrowShots = function(points) {
points.sort((a,b)=>{
if (a[0]!==b[0]) {
return a[0]-b[0]
} else {
return a[1] - b[1];
}
});
let res = 1;
for (let i=1;i<points.length;i++) {
if (points[i][0] > points[i-1][1]) {
res++;
} else {
points[i][1] = Math.min(points[i][1], points[i-1][1])
}
}
return res;
};
- 無重疊區間
https://programmercarl.com/0435.無重疊區間.html
跟上一題類似,但需要一個變數記錄上一輪的重疊右邊界
/**
* @param {number[][]} intervals
* @return {number}
*/
var eraseOverlapIntervals = function(intervals) {
intervals.sort((a, b)=>{
if (a[0] !== b[0]) {
return a[0] - b[0];
} else {
return a[1] - b[1];
}
})
let res = 0;
let end = intervals[0][1];
for (let i=1;i<intervals.length;i++) {
if (intervals[i][0] < end) {
res++;
end = Math.min(intervals[i][1], end)
} else {
end = intervals[i][1]
}
}
return res;
};
763.劃分字母區間
https://programmercarl.com/0763.劃分字母區間.html
有思路,但寫不出來
/**
* @param {string} s
* @return {number[]}
*/
var partitionLabels = function(s) {
const sArr = new Array();
for (let i=0;i<s.length;i++) {
let index = s[i].charCodeAt() - 'a'.charCodeAt();
sArr[index] = i;
}
let index = 0;
const res = [];
let prev = 0
for (let i=0;i<s.length;i++) {
let ind = s[i].charCodeAt() - 'a'.charCodeAt()
index = Math.max(index, sArr[ind]);
if (i === index) {
res.push(i + 1 - prev);
prev = i+1;
}
}
return res;
};