程式碼隨想錄演算法訓練營第第36天 | 452. 用最少數量的箭引爆氣球、435. 無重疊區間、763.劃分字母區間

YuanYF6發表於2024-06-12

今天的三道題目,都算是 重疊區間 問題,大家可以好好感受一下。 都屬於那種看起來好複雜,但一看貪心解法,驚呼:這麼巧妙!

這種題還是屬於那種,做過了也就會了,沒做過就很難想出來。

不過大家把如下三題做了之後, 重疊區間 基本上差不多了

  1. 用最少數量的箭引爆氣球
    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;
};
  1. 無重疊區間

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;
};

相關文章