代码随想录day36
目录
435. 无重叠区间
思路:
func eraseOverlapIntervals(intervals [][]int) int {
if len(intervals) == 0 {return 0}
//先排序,按照右排序
sort.Slice(intervals, func(i, j int) bool {
return intervals[i][1] < intervals[j][1]
})
count := 1 // 记录没有交叉的区间。至少为1
end := intervals[0][1]
for i := 1; i < len(intervals); i++ {
if intervals[i][0] <= end { // 当前数组的左大于上一个数组的右,说明他俩不重叠。
end = intervals[i][1] // 更新end,好让下一位继续来和其比较啊
count++
}
}
return len(intervals) - count // 总的长度-没有重叠的 = 要删除的那些重叠的
}
763.划分字母区间
思路:
func partitionLabels(s string) []int {
var res []int;
var marks [26]int;
size, left, right := len(s), 0, 0
// 标记
for i := 0; i < size; i++ {
marks[s[i] - 'a'] = i // 最后出现的会覆盖前面出现的位置
// 例如 a = 3 说明a在下标3出现过
// 但是后面在下标8也遇到了,则a = 8
// 那么下面在遍历数组的时候,就能知道当前字母所对应的出现的最远的位置
}
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 // 切割完要更新left的位置。为当前位置+1开始
}
}
return res
}
func max(a, b int) int {
if a < b {
a = b
}
return a
}
56. 合并区间
func merge(intervals [][]int) [][]int {
//先从小到大排序
sort.Slice(intervals, func(i, j int) bool {
return intervals[i][0] < intervals[j][0]
})
ans := [][]int{}
flag := false // 标记用的,用来判断最后一组区间有没有被合并啊
for i := 1; i < len(intervals); i++ {
start := intervals[i-1][0] //初始化为i-1区间的左边界
end := intervals[i-1][1] // 初始化为i-1区间的右边界
for i < len(intervals) && intervals[i][0] <= end { // 满足合并区间的条件
end = max(end, intervals[i][1])
if i == len(intervals)-1 {
flag = true // 表示最后一个区间是有被合并的
}
i++
}
// start和end是表示intervals[i-1]的左边界和右边界,所以最优intervals[i]区间是否合并了要标记一下
ans = append(ans, []int{start, end})
}
// 如果最后一个区间没有合并,将其加入ans
if flag == false {
ans = append(ans, []int{intervals[len(intervals)-1][0], intervals[len(intervals)-1][1]})
}
return ans
}
func max(a,b int) int {
if a > b {
return a
}
return b
}