首页 > 编程语言 >代码随想录算法训练营第二十六天|452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间

代码随想录算法训练营第二十六天|452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间

时间:2024-08-02 08:56:00浏览次数:19  
标签:right 下标 重叠 763 随想录 intervals points result 区间

写代码的第二十六天
继续贪心贪心!!!

452. 用最少数量的箭引爆气球

思路

最少的弓箭引爆气球,那么就是要看有没有重复覆盖的区域,如果有的话,那么一个弓箭就能引爆重复区域的气球,所以本题就是要看有多少气球是重复的,如果重复就用一根弓箭,如果不重复就加一。
解决问题1:如何判断是否有重叠部分?将这个数组按照左端点位置排序,然后按照排序后的数组查看,第i位的数组的左端点的数值是否大于第i-1位数组的右端点的值,如果大于那么就证明不存在重叠的情况,弓箭数加一,否则就是重叠的。
解决问题2:题中没有说最多两个气球重叠,所以很有可能出现好几个气球是重叠的。就比如说i-1位和i位是重叠的,那i+1位是否和i-1和i的重叠部分也重叠的呢?我们思考一下i-1位和i位的重叠位置是i-1位的右下标到i位的左下标这个范围,那么就是说如果i+1位的左下标在上面的范围里面就证明他们仨重叠!所以i+1位的左下标只要小于等于i-1位的右下标即可。所以在这里我们要做的就是每次比较之后都更新右边界,也就是右下标,上面是举了个例子,但是代码要写普适性的代码,所以遍历的时候要保留每次的当前结点的右边界和上一位结点的右边界的最小值,这样在比较下一个结点的时候,直接和这个右边界进行比较,就可以走之前的if步骤的流程了,让当前结点的左边界和保留的最小右边界进行比较。
正确代码

class Solution:
    def findMinArrowShots(self, points: List[List[int]]) -> int:
        if len(points) == 0:
            return 0
        result = 1
        points = sorted(points,key=lambda x: (x[0], x[1]))
        for i in range(len(points)):
            if points[i][0] > points[i-1][1]:
                result += 1
            else:
                points[i][1] = min(points[i-1][1],points[i][1])
        return result

435. 无重叠区间

思路

本题和上面的题思路和注意点是一致的,只不过本题是要找到重叠区间,查看有几个重叠区间,所以初始化重叠区间为count=0,然后按照左下标进行从小到大的排序,排序后开始判断是否有重叠部分,按照上一道题的思路第i位的数组的左端点的数值是否大于第i-1位数组的右端点的值,如果大于那么就证明不存在重叠的情况,否则就存在重叠情况,count+=1;还有一个问题如果下面的数组的范围也在上面的重叠区间呢?和上一道题一样,我们记录每次重叠出现的最小右边界,这样如果接下来的数组左下标小于这个右下标就证明存在重叠,就回到了if的判断条件中了。
正确代码

class Solution:
    def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
        intervals = sorted(intervals,key=lambda x: (x[0], x[1]))
        count = 0
        for i in range(len(intervals)):
            if i > 0 and intervals[i][0] < intervals[i-1][1]:
                count += 1 
                intervals[i][1] = min(intervals[i][1],intervals[i-1][1])
        return count

763.划分字母区间

思路

本题要找的是字母的子区间并且顺序不能变,每个区间要包含这个字符串中出现字符的全部,比如说有a那就要包括这个s字符串中的所有a,一点思路也没有,直接看视频。。。
首先,建立哈希表,这个哈希表是用来存储s字符串中每个字符出现的最远的下标,这样就能在遍历s字符串的时候知道在s字符串中个子字符串的最远下标;其次我们要找的是每个子串的长度,所以需要知道每个子串的左端点left和右端点right,append进result的就是right-left+1,下一个left的位置就是之前子串的right+1;所以我们会发现需要判断的就是right的值,right值其实就是每遍历一个s中的字符都去看这个字符的最远位置在哪,如果该字符的最远位置和当前i的位置一致那么此时一个子串已经出来了;如果不一致那么就要每次的right值都更新为当前字符的最远距离和之前的right值最大的那个。
正确代码

class Solution:
    def partitionLabels(self, s: str) -> List[int]:
        hashtable = {}        
        for i in range(len(s)):
            hashtable[ord(s[i])-ord('a')] = i
        result = []
        left = 0
        right = 0
        for i in range(len(s)):
            right = max(hashtable[ord(s[i])-ord('a')],right)
            if right == i:
                result.append(right-left+1)
                left = i + 1
        return result

标签:right,下标,重叠,763,随想录,intervals,points,result,区间
From: https://blog.csdn.net/MYSTICSHUN/article/details/140837171

相关文章

  • 代码随想录算法训练营第二十七天| 56. 合并区间、738.单调递增的数字
    写代码的第二十七天最后一天贪心!!!加油呀!!!56.合并区间思路这道题本质上和昨天的两道题是几乎完全一致的,都是判断重叠区间,只不过昨天的射箭那道题是统计有多少重叠区间,无重叠区间那道题是找到重叠区间然后删除,这道题是找到重叠区间然后合并。解决问题1:如何对重叠区间进行......
  • 「代码随想录算法训练营」第二十六天 | 贪心算法 part4
    452.用最少数量的箭引爆气球题目链接:https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/题目难度:中等文章讲解:https://programmercarl.com/0452.用最少数量的箭引爆气球.html视频讲解:https://www.bilibili.com/video/BV1SA41167xe题目状态:有点思路......
  • 「代码随想录算法训练营」第二十五天 | 贪心算法 part3
    134.加油站题目链接:https://leetcode.cn/problems/gas-station/题目难度:中等文章讲解:https://programmercarl.com/0134.加油站.html视频讲解:https://www.bilibili.com/video/BV1jA411r7WX题目状态:没有思路,学习题解思路一:全局最优解首先将所有路径的加油量和耗油量加一起......
  • 代码随想录Day2
    209.长度最小的子数组给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其总和大于等于target的长度最小的子数组$[nums_l,nums_{l+1},...,nums_{r-1},nums_r]$,并返回其长度。如果不存在符合条件的子数组,返回0。示例1:输入:target=7,nums=......
  • 代码随想录算法训练营第56天 | 广搜和深搜应用
    110.字符串接龙https://kamacoder.com/problempage.php?pid=1183代码随想录https://www.programmercarl.com/kamacoder/0110.字符串接龙.html#思路105.有向图的完全可达性https://kamacoder.com/problempage.php?pid=1177代码随想录https://www.programmercarl.com/kamaco......
  • 洛谷 B3612 【深进1.例1】求区间和
    "这道题也太水了吧,模拟就行了!""数据范围...""好像不行呀""呜呜~~TLE!"献上暴力代码!#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+5;intn,a[N],m;signedmain(){ios::sync_with_stdio(0);cin.tie(0);......
  • 代码随想录算法训练营day01|704. 二分查找,27. 移除元素,977.有序数组的平方
    704.二分查找题目链接:https://leetcode.cn/problems/binary-search/description/本人代码:classSolution{public:intsearch(vector<int>&nums,inttarget){intlow=0,high=nums.size()-1;//此处分情况讨论returnsearchTarget(nums,low,high,tar......
  • 代码随想录day16 || 513 树左下角值,112 路径之和,116 中序后序遍历构造二叉树
    切片传递问题question:什么情况下传递切片,什么情况下传递切片指针,为什么有时候会修改原始副本,有时候又不会呢?typesli[]intfuncmain(){ slice:=[]int{1} fmt.Printf("slice:%p\n",slice) change1(slice) fmt.Println("=================================") s2:=......
  • 区间预测 | 光伏出力的区间预测(Matlab)
    区间预测|光伏出力的区间预测(Matlab)目录区间预测|光伏出力的区间预测(Matlab)效果一览基本介绍程序设计参考资料效果一览基本介绍1.适用于matlab2020及以上。可任意选择置信区间,区间覆盖率picp、区间平均宽度百分比等等,可用于预测不确定性,效果如图所示,完全满......
  • 代码随想录Day1
    704.二分查找给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且下标为4示例2:......