算法练习day31

67 阅读1分钟

一、无重叠区间

右边界排序,寻找最多非重叠区间

/**
 * @param {number[][]} intervals
 * @return {number}
 */
var eraseOverlapIntervals = function(intervals) {
    intervals.sort((a, b) => a[1] - b[1])
    // 最多
    let count = 1
    let end = intervals[0][1]
    for(let i = 1; i < intervals.length;i++) {
        if(intervals[i][0] >= end) {
            count++
            end = intervals[i][1]
        }
    }
    return intervals.length - count
};

左边界排序,寻找最少重叠区间

var eraseOverlapIntervals = function(intervals) {
    intervals.sort((a, b) => a[0] - b[0])
    let count = 0
    let minRight = intervals[0][1]
    for(let i = 1; i < intervals.length;i++) {
        if(intervals[i][0] < minRight) {
            count++
            minRight = Math.min(minRight, intervals[i][1])
        } else {
            // 这一步,别漏了
            minRight = intervals[i][1]
        }
    }
    return count
};

左边界排序简化写法

var eraseOverlapIntervals = function(intervals) {
    intervals.sort((a, b) => a[0] - b[0])
    let count = 0
    for(let i = 1; i < intervals.length;i++) {
        if(intervals[i][0] < intervals[i-1][1]) {
            count++
            intervals[i][1] = Math.min(intervals[i-1][1], intervals[i][1])
        }
    }
    return count
};

二、划分字母区间

如果找到遍历过的所有字母的最远边界,则说明这个边界就是分割点了

/**
 * @param {string} s
 * @return {number[]}
 */
var partitionLabels = function(s) {
    let map = {}
    for(let i = 0; i< s.length;i++) {
        map[s[i]] = i
    }
    let result = []
    let left = 0
    let right = 0
    for(let i = 0; i < s.length;i++) {
        right = Math.max(right, map[s[i]])
        if(i === right) {
            result.push(right - left + 1)
            left = right + 1
        }
    }
    return result
};

三、合并区间

通过排序,尽量相邻区间重叠,判断重叠后更新右边界,右边界为两个重叠区间右边界的最大值

/**
 * @param {number[][]} intervals
 * @return {number[][]}
 */
var merge = function(intervals) {
    if(!intervals.length) {
        return []
    }
    intervals.sort((a, b) => a[0] - b[0])
    let result = [intervals[0]]
    for(let i= 1;i<intervals.length;i++) {
        if(intervals[i][0] <= result[result.length - 1][1]) {
            result[result.length - 1][1] = Math.max(result[result.length - 1][1], intervals[i][1])
        } else {
            result.push(intervals[i])
        }
    }
    return result

};