435.无重叠区间
对右边界升序排序,类似用最少数箭射爆气球,遍历区间,若当前区间与前一个区间不重合,更新区间边界end
为当前区间右边界,并记录不重合区间个数,最终结果:区间总数-不重区间数
func eraseOverlapIntervals(intervals [][]int) int {
sort.Slice(intervals, func(i, j int) bool {
return intervals[i][1] < intervals[j][1]
})
res := 1
end := 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, 0
for 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
}
代码随想录文章详解
总结
思路猜对一半一半的,细节思考不到