代码随想录算法训练营|day36

本文介绍了使用贪心策略解决的三个编程问题:无重叠区间的合并、划分字母区间的标记以及合并区间。重点在于理解思路和细节处理。
摘要由CSDN通过智能技术生成

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
}

代码随想录文章详解

435.无重叠区间
763.划分字母区间
56.合并区间

总结

思路猜对一半一半的,细节思考不到

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值