第八章 贪心算法
- 435.无重叠区间
- 763.划分字母区间
- 56.合并区间
- 代码随想录文章详解
- 总结
435.无重叠区间
对右边界升序排序,类似用最少数箭射爆气球,遍历区间,若当前区间与前一个区间不重合,更新区间边界end
为当前区间右边界,并记录不重合区间个数,最终结果:区间总数-不重区间数
func eraseOverlapIntervals(intervals [][]int) int {sort.Slice(intervals, func(i, j int) bool {return intervals[i][1] < intervals[j][1]})res := 1end := intervals[0][1]for i := 1; i < len(intervals); i++ {//不重合更新右边界,并记录不重合个数if end <= intervals[i][0] {end = intervals[i][1]res++}}return len(intervals) - res
}
763.划分字母区间
记录数组中字符出现的最远位置。遍历字符串,若当前位置为最远距离,加入结果集
func partitionLabels(s string) []int {res := []int{}marks := []int{}left, right := 0, 0for i := 0; i < len(s); i++ {// 统计数组中字符出现的最远位置[同字符随遍历过程最远距离更新]marks[s[i]-'a'] = i}for i := 0; i < len(s); i++ {right = max(marks[s[i]-'a'], right)if i == right {res = append(res, right-left+1)left = i + 1}}return res
}
56.合并区间
对数对左区间排序,若区间不重合,直接追加,并更新start,end;若区间重合,探索右边界,直到不重合
func merge(intervals [][]int) [][]int {sort.Slice(intervals, func(i, j int) bool {return intervals[i][0] < intervals[j][0]})res := [][]int{}start, end := intervals[0][0], intervals[0][1]for i := 1; i < len(intervals); i++ {if end < intervals[i][0] {res = append(res, []int{start, end})start, end = intervals[i][0], intervals[i][1]} else {end = max(intervals[i][1], end)}}res = append(res, []int{start,end})return res
}
代码随想录文章详解
435.无重叠区间
763.划分字母区间
56.合并区间
总结
思路猜对一半一半的,细节思考不到