首页 > 编程语言 >Day30 贪心算法part4

Day30 贪心算法part4

时间:2024-08-15 10:48:35浏览次数:12  
标签:重叠 res points Day30 intervals part4 区间 气球 贪心

目录

任务

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

有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] = [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。

一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被 引爆 。可以射出的弓箭的数量 没有限制 。 弓箭一旦被射出之后,可以无限地前进。

给你一个数组 points ,返回引爆所有气球所必须射出的 最小 弓箭数 。

思路

非重叠时,需要增加箭的数量
重叠时,需要更新当前最右端的值为重叠区间内最小值,以便判断后面的气球是否与当前区间重叠

class Solution:
    def findMinArrowShots(self, points: List[List[int]]) -> int:
        points.sort(key= lambda x:x[0]) #按照开始位置排序
        
        res = 1
        for i in range(1,len(points)):
            if points[i][0] <= points[i-1][1]: # 重叠
                points[i][1] = min(points[i][1],points[i-1][1])
            else:
                res += 1
        return res

435. 无重叠区间

给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。

思路

问题转化为求重叠区间的个数,本题与上题的重叠区间定义有略微的不同,即两个区间左右界桩相等时的判断(上题判断为重叠,本题判断为不重叠)

class Solution:
    def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
        intervals.sort(key= lambda x:x[0]) #按照开始位置排序
        res = 0 #重叠区间个数
        for i in range(1,len(intervals)):
            if intervals[i][0] < intervals[i-1][1]: # 重叠
                res +=1
                intervals[i][1] = min(intervals[i][1],intervals[i-1][1])
        return res

763. 划分字母区间

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。

注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。

返回一个表示每个字符串片段的长度的列表。

思路

边遍历边记录最远位置,达到当前区间最远位置时记录。

class Solution:
    def partitionLabels(self, s: str) -> List[int]:
        hashmap = {} # key:char value:maxDis
        for i in range(len(s)):
            hashmap[s[i]] = i
        
        left,right = 0,0
        res = []
        for i in range(len(s)):
            right = max(right,hashmap[s[i]])
            if i == right:
                num =  right - left + 1
                res.append(num)
                left = right+1
        return res

标签:重叠,res,points,Day30,intervals,part4,区间,气球,贪心
From: https://www.cnblogs.com/haohaoscnblogs/p/18360452

相关文章

  • Day28 贪心算法part2
    任务122.买卖股票的最佳时机II给你一个整数数组prices,其中prices[i]表示某支股票第i天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候最多只能持有一股股票。你也可以先购买,然后在同一天出售。返回你能获得的最大利润。思路考虑分解最终......
  • 算法-贪心
    1.分发饼干(LeetCode455)假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子i,都有一个胃口值g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干j,都有一个尺寸s[j]。如果s[j]>=g[i],我们可以将这个饼干j分配给......
  • 可持久化可反悔贪心
    接到上级通知,贪心思路假了,紧急需要调整思路思路假了?考虑反悔while(思路==false){cout<<"思路假了"<<endl;思路=true;cout<<"改对了"<<endl;}SampleOutput思路假了改对了思路假了改对了思路假了改对了思路假了改对了思路假了改对了思路假了改对了......
  • 贪心法-一般背包问题
    一般背包问题问题描述想象你有一个背包,它最多可以放M公斤的物品。你面前有n个物品,每个物品的重量是Wi,如果将这个物品完全放入背包,你将获得Pi的收益。问题目标你需要决定如何放置这些物品,以便在不超过背包容量的前提下,获得最大的收益。问题类型0/1背包问题:每个......
  • Day27 贪心算法part1
    任务455.分发饼干假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子i,都有一个胃口值g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干j,都有一个尺寸s[j]。如果s[j]>=g[i],我们可以将这个饼干j分配给孩子i,这......
  • 「代码随想录算法训练营」第三十一天 | 动态规划 part4
    1049.最后一块石头的重量II题目链接:https://leetcode.cn/problems/last-stone-weight-ii/题目难度:中等文章讲解:https://programmercarl.com/1049.最后一块石头的重量II.html视频讲解:https://www.bilibili.com/video/BV14M411C7oV/题目状态:看题解过思路:本题本质上就是将......
  • 贪心
    有些题dp是难做的或做不了的,这个时候可以去设计一种策略使得决策尽可能最优,也就是贪心。可以说贪心有时候是一种乱搞,但乱搞也能搞出出题人想不到的正解。反悔贪心有些题中直接dp的复杂度很高并且很难优化或者有后效性无法dp,朴素贪心考虑可以做到\(O(n)\)但是无法保证正确......
  • 贪心系列专题篇四
    目录整数替换解法一解法二俄罗斯套娃信封问题堆箱子可被三整除的最大和距离相等的条形码重构字符串声明:接下来主要使用贪心法来解决问题!!!整数替换题目思路下面将使用两种方法来解决这道题,第一种方法是递归+记忆化搜索;第二种方法是贪心。解法一使用递归+记忆......
  • 贪心算法-活动安排问题
    贪心算法贪心算法总是选择当前看起来最优的选择(局部最优解),希望得到的结果是一个整体最优解。但是,并非总是选择局部最优解就能够得到整体最优解,这一点需要在问题具有贪心选择性和优化子结构时才成立。贪心选择性贪心选择性:第一次做出贪心选择是正确的。优化子结构问题......
  • 「Day 2—贪心问题&分治&前缀和」
    贪心问题定义顾名思义,越贪越好。。。习题P1094[NOIP2007普及组]纪念品分组思路简单来说:最少的+最多的,利用双指针。代码#include<algorithm>#include<iostream>usingnamespacestd;intw,n;intp[30005];intmain(){cin>>w;cin>>n;for(inti=1;i......