欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > 区间有关的贪心解题记录435无重叠区间452用最少数量的箭引爆气球

区间有关的贪心解题记录435无重叠区间452用最少数量的箭引爆气球

2025/4/1 16:47:18 来源:https://blog.csdn.net/qq_45815776/article/details/146676978  浏览:    关键词:区间有关的贪心解题记录435无重叠区间452用最少数量的箭引爆气球

无重叠区间我的想法是开一个数组a,遍历给出的区间,在数组a里将对应落在的区间index标记。如果有重复区间就只选择最小的那个区间标记。但是这道题的区间好像很长-5 * 104 <= starti < endi <= 5 * 104没法用数组a表示总的区间范围。

核心思路是当多个区间覆盖同一个点时,保留更短的区间。那么怎么模拟区间覆盖过程呢?我们只好从已经有的区间入手,按照区间的结尾进行排序,每次选择结尾最早的给后面留出更大的空间,且选择和前一个区间不重叠的。

func eraseOverlapIntervals(intervals [][]int) int {if len(intervals) < 2 {return 0}// 排序区间末尾的那个点。区间末尾越小,越多空间留给其他区间使用。贪心时可以选择尽量多的不重叠区域sort.Slice(intervals, func(i, j int) bool {return intervals[i][1] < intervals[j][1]})// 按顺序遍历区间,有重合区间的删除res := 0maxlen := intervals[0][0]  // 记录最长距离,用于判断是否会重合。因为不知道每次最长距离从哪里开始。for _, v := range intervals {if v[0] >= maxlen {maxlen = v[1]} else {fmt.Println(v)res++}} return res
}

用最少数量的箭引爆气球读完题目也想开一个数组记录区间。看了看也不行,借鉴上一道题目,减去重叠区间就是要射箭的次数。

func findMinArrowShots(points [][]int) int {if len(points) < 2 {return len(points)}sort.Slice(points, func(i, j int) bool {return points[i][1] < points[j][1]})res := 0maxlen := points[0][1]  for i:=1; i<len(points); i++ {if points[i][0] > maxlen {maxlen = points[i][1]} else {// fmt.Println(points[i])res++}} return len(points)-res
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词