[代码随想录]Day31-贪心算法part05

发布时间 2023-08-30 10:25:31作者: WtcSky

题目:435. 无重叠区间

思路:

移除最少就是保留最多,和昨天最后一个题一样就是选出最多的不重叠区间。
记住一点——右边界越小,后续可以选取的范围就越大,可能选取到的就越多

代码:

func eraseOverlapIntervals(intervals [][]int) int {
    sort.Slice(intervals,func(i,j int) bool {
        return intervals[i][1] < intervals[j][1] 
    })
    res := 0
    index := math.MinInt
    for _, x := range intervals {
        if x[0] >= index {
            index = x[1]
            continue
        }
        res++
    }
    return res
}

参考:

代码随想录

题目:763. 划分字母区间

思路:

这道题在于覆盖的区间会互相影响,因此不断地更新右区间,直到i走到了right右边界就说明后续的区间不与这一次的区间有交集。

代码:


func partitionLabels(s string) []int {
    res := []int{}
    marks := [26]int{}
    size, left, right := len(s), 0, 0
    for i := 0; i < size; i++ { // 记录右边界
        marks[s[i] - 'a'] = i
    }
    for i := 0; i < size; i++ {
        right = max(right, marks[s[i] - 'a']) // 更新右边界
        if i == right { // 到达边界了,一个互相覆盖的区间结束
            res = append(res, right - left + 1)
            left = i + 1
        }
    }
    return res
}

func max(a, b int) int {
    if a < b {
        a = b
    }
    return a
}

参考:

代码随想录

题目:56. 合并区间

思路:

本来第二题想这么做,但是第二题这么做复杂无比,需要做许多的预处理……
因为需要合并区间,所以得按照左边界来排序,方便知道是否在区间内(需要合并):

  1. 如果当前元素左边界大于区间右边界 —— 添加结果,更新区间边界(左,右)
  2. 如果当前元素左边界小于区间右边界但是右边界大于区间右边界 —— 更新区间边界(右)
    注意一点,在退出循环后需要再额外的添加一次结果,因为最后一次的区间没有添加。

代码:

func merge(intervals [][]int) [][]int {
    sort.Slice(intervals,func(i,j int)bool {
        return intervals[i][0] < intervals[j][0]
    })
    res := [][]int{}
    lens := len(intervals)
    left, right := intervals[0][0], intervals[0][1]
    for i := 1; i < lens; i++ {
        if intervals[i][0] > right {
            res = append(res, []int{left,right})
            left = intervals[i][0]
            right = intervals[i][1]
            continue
        }
        if intervals[i][1] > right {
            right = intervals[i][1]
        }
    }
    res = append(res, []int{left,right})
    return res
}

参考:

代码随想录