首页 > 其他分享 >代码随想录day30 || 452 引爆气球,435 无重叠区间,763 划分字母区间

代码随想录day30 || 452 引爆气球,435 无重叠区间,763 划分字母区间

时间:2024-08-15 11:50:32浏览次数:10  
标签:return int res 随想录 points func 区间 end 435

452 射爆气球

func findMinArrowShots(points [][]int) int {
	// 思路,尝试按照start asc,end asc 排序一下, 取交集射爆
	if len(points) == 1{
		return 1
	}

	sort.Slice(points, func (i, j int) bool {
		if points[i][0] == points[j][0] {
			return points[i][1] < points[j][1]
		}
		return points[i][0] < points[j][0]
	})

	// 相邻判断交际
	var count int
	var res []int
	for i:=1; i < len(points); {
		res = points[i-1]
		for i < len(points) && res != nil {  // 运行到第k个气球发现没有交集,所以退出,此时i++, i=k+1
			res = intersection(res, points[i])
			i++
			fmt.Println(i, res)
		}
		if i == len(points) && res == nil {
			count++ // 最后一个没有交集需要补上
		}
		count++ // 此时需要一把箭射爆有交集的所有气球
	}

	return count
}
func intersection(x,y []int) []int {
	start := max(x[0], y[0])
	end := min(x[1], y[1])
	if start > end {
		return nil
	}
	return []int{start, end}
}

func max(x,y int) int {
	if x > y {
		return x
	}
	return y
}
func min(x,y int) int {
	if x < y {
		return x
	}
	return y
}

image

// 通过考虑边界简化交集算法
func findMinArrowShots(points [][]int) int {
	// 思路,尝试按照start asc,end asc 排序一下
	if len(points) == 1{
		return 1
	}

	sort.Slice(points, func (i, j int) bool {
		if points[i][0] == points[j][0] {
			return points[i][1] < points[j][1]
		}
		return points[i][0] < points[j][0]
	})

	// 相邻判断交际
	var count int = 1
	for i:=1; i < len(points); i++{
		if points[i][0] > points[i-1][1] { // [1,2], [3,4] 后一个气球左边界大于前一个起球的右边界,没有重叠
			count++
		}else { // 有重叠,则更新边界
			points[i][1] = min(points[i][1], points[i-1][1])
		}
	}

	return count
}
func min (x , y int)int{
	if x < y {
		return x
	}
	return y
}

435 无重叠区间

func eraseOverlapIntervals(intervals [][]int) int {
	// 思路,尝试按照start asc,end asc 排序一下
	if len(intervals) <= 1{
		return 0
	}

	sort.Slice(intervals, func (i, j int) bool {
		if intervals[i][0] == intervals[j][0] {
			return intervals[i][1] < intervals[j][1]
		}
		return intervals[i][0] < intervals[j][0]
	})

	// 相邻判断交际
	var count int
	for i:=1; i < len(intervals); i++{
		if intervals[i][0] >= intervals[i-1][1] {
		}else { // 有重叠,则更新边界
			count++
			intervals[i][1] = min(intervals[i][1], intervals[i-1][1])
		}
	}

	return count
}
func min (x , y int)int{
	if x < y {
		return x
	}
	return y
}

划分字母区间

image

func partitionLabels(s string) []int {
	// 考虑暴力双指针,对于每一个字符,向后面判断是否有重复,没有就开始划分
	if len(s) == 1 {
		return []int{1}
	}

	var dismap = make(map[byte]int) // 保存字母出现的最远位置
	for i:=0; i<len(s); i++ {
		if dismap[s[i]] < i{
			dismap[s[i]] = i
		}
	}

	var disslice []int
	for i := 0; i<len(s); i++ {
		disslice = append(disslice, dismap[s[i]])
	}

	var start, end, m int
	var res []int
	for start < len(s) {
		end = disslice[start]
		m = max(disslice[start: end+1])
		for m > end {
			end = m
			m = max(disslice[start: end+1])
		}
		// 此时end是区间内部最大值(可能多个最大值)
		res = append(res, end - start + 1)
		start = end + 1

	}
	return res
}

func max(list []int) int {
	var m int = math.MinInt
	for _, v := range list {
		if v > m {
			m = v
		}
	}
	return m
}

标签:return,int,res,随想录,points,func,区间,end,435
From: https://www.cnblogs.com/zhougongjin55/p/18360609

相关文章

  • 代码随想录Day15
    110.平衡二叉树(优先掌握递归)给定一个二叉树,判断它是否是平衡二叉树平衡二叉树是指该树所有节点的左右子树的深度相差不超过1。示例1:输入:root=[3,9,20,null,null,15,7]输出:true示例2:输入:root=[1,2,2,3,3,null,null,4,4]输出:false示例3:输入:root=[]输出:t......
  • 线段树+懒标记 (区间修改,区间查询)
    原作者:董晓P3372【模板】线段树1//结构体版#include<cstring>#include<iostream>#include<algorithm>usingnamespacestd;#defineN100005#defineLLlonglong#definelcu<<1#definercu<<1|1LLw[N];structTree{//线段树LLl,r,......
  • ST表 RMQ问题(区间最大/最小值查询)
    #include<iostream>#include<cstring>#include<algorithm>#include<cmath>usingnamespacestd;intf[100005][22];intmain(){intn,m;scanf("%d%d",&n,&m);for(inti=1;i<=n;i++)scanf("%d"......
  • 【代码随想录】一、数组:3.双指针 - 977.有序数组的平方
    本文为977.有序数组的平方的解法,部分图文参考自代码随想录977.有序数组的平方。1.题目1:977.有序数组的平方1.1.解法1:直接排序classSolution{public:vector<int>sortedSquares(vector<int>&nums){for(inti=0;i<nums.size();i++){n......
  • 【代码随想录】一、数组:2.移除元素
    部分图文参考于:代码随想录-移除元素和力扣官方解法。1.题目1★:27.移除元素1.1.解法1:暴力解法考验对数组底层实现的理解:数组的元素是不能删的,只能覆盖。通过两层for循环来求解,外层for循环遍历数组元素,内层for循环将目标值进行覆盖。classSolution{public:intremove......
  • 【代码随想录】一、数组:1.二分查找
    部分图文参考于:代码随想录-二分查找,本文仅作为个人学习使用,如有侵权,请联系删除。1.概念二分查找也称折半查找(BinarySearch),是一种在有序数组中查找某一特定元素的搜索算法。我们可以从定义可知,运用二分搜索的前提是数组必须是有序的,这里需要注意的是,我们的输入不一定是数组,也......
  • 【代码随想录】一、数组:理论基础
    原文链接:代码随想录-数组理论基础,本文仅作为个人学习使用,如有侵权,请联系删除。数组是非常基础的数据结构,在面试中,考察数组的题目一般在思维上都不难,主要是考察对代码的掌控能力。数组是存放在连续内存空间上的相同类型数据的集合。数组可以方便的通过下标索引的方式获取到下......
  • 代码随想录训练营day20|235. 二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,450
    二叉搜索树的最近公共祖先题目根据二叉搜索树的特性,它的公共祖先肯定是值夹在p和q之间的(满足此条件的第一个点)TreeNode*getroot(TreeNode*root,TreeNode*p,TreeNode*q){ if(rooot==NULL)returnNULL; if(root->val<p->val&&root->val<q->val){ returngetroot(r......
  • 代码随想录day29 || 134 加油站,135 分糖果,860 柠檬水找零,406 根据身高重建队列
    加油站funccanCompleteCircuit(gas[]int,cost[]int)int{ //思路,首先统计一个差值数组,表示行驶到下一个加油站可以补充的油量,然后加总差值数组, //如果小于0,表示从起始位置到目前为止剩余油量小于0,不足以跑完全程,同时将起始位置放到遍历的下一个位置 iflen(gas)==0......
  • 代码随想录算法训练营第二十八天 | 122.买卖股票的最佳时机II , 55. 跳跃游戏 , 45.跳跃
    目录122.买卖股票的最佳时机II 思路方法一:贪心方法二:动态规划55.跳跃游戏思路方法一:使用while循环方法二:使用for循环45.跳跃游戏II 思路方法一方法二方法一:贪心方法一方法二:贪心方法二 方法三:贪心方法三心得体会1005.K次取反后最大化的数组和思路方法......