代码随想录day36|435. 无重叠区间|763.划分字母区间|56. 合并区间 |Golang

代码随想录day36

目录

435. 无重叠区间

763.划分字母区间

 56. 合并区间


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
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值