当前位置: 首页 > article >正文

day30|leetcode 452. 用最少数量的箭引爆气球, 435. 无重叠区间 , 763.划分字母区间

重叠区间专题

11.用最少的数量引爆气球

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

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

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

class Solution {
static bool cmp(const vector<int>&a,vector<int>&b)
{
    return a[0]<b[0];
}
public:
    int findMinArrowShots(vector<vector<int>>& points) {
        if(points.size()==0)return 0;
        sort(points.begin(),points.end(),cmp);
        
        int result = 1;//points不为0时至少需要一支箭
        for(int i=1;i<points.size();i++)
        {
            if(points[i][0]>points[i-1][1])//不挨着
            {
                result++;
            }
            else{
                points[i][1]=min(points[i-1][1],points[i][1]);//更新气球最新右边界
            }
        }
       return result;
    }
};
**  points[i][1]=min(points[i-1][1],points[i][1]);//更新气球最新右边界 **
为什么要这样更新?
    因为由图可以发现,如果不更新右区间,那么4-8这个气球又会被当作可以和7-12一起被射爆,这样就会得出一箭射爆前三个气球的错误结       论,但是实际上,前两个最多在6位置被射爆,实际需要两支箭,所以要更新右边界,取小值

时间复杂度:O(nlogn)快排

空间复杂度:O(1),有一个快排,最差情况(倒序)时,需要n次递归调用。因此确实需要O(n)的栈空间

12.无重叠区间

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

注意 只在一点上接触的区间是 不重叠的。例如 [1, 2][2, 3] 是不重叠的。

思路: 通过排序让区间尽可能的重叠,然后开始删除,用左或右边界排序都可以

与上一题十分类似

class Solution {
    //按右边界排序
    static bool cmp(const vector<int>&a,const vector<int>&b)
    {
        return a[1]<b[1];
    }
​
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        if(intervals.size()==0)return 0;
        sort(intervals.begin(),intervals.end(),cmp);
        int count = 1;//记录非交叉区间的个数
        int end = intervals[0][1];//分割点
        for(int i=1;i<intervals.size();i++)
        {
            if(end<=intervals[i][0])//不挨着
            {
              end=intervals[i][1];
              count++;
            }
        }
        return intervals.size()-count;
    }
};

时间复杂度:nlogn(快排)

13.划分母区间

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

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

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

思路: 通过一层循环找到每个元素的最远边界位置right

如果循环遍历到了right,即i==right,说明后面不会再出现这个字符了,可以开始划分

class Solution {
public:
    vector<int> partitionLabels(string s) {
        int hash[27]={0};//存储每个字符最远边界的位置
        for(int i=0;i<s.size();i++)
        {
           hash[s[i]-'a']=i;
        }
​
        int right=0;//右边界
        int left = 0;//划分左边界
        vector<int>result;
        for(int i=0;i<s.size();i++)
        {
            right=max(right,hash[s[i]-'a']);
            if(i==right)//是时候该划分了
            {
                result.push_back(right-left+1);
                left=i+1;
            }
        }
        return result;
    }
};


http://www.kler.cn/a/417349.html

相关文章:

  • 0207算法:寻找目标值、库存管理
  • 杭州某小厂面试
  • Windows 中学习Docker环境准备2、Docker Desktop中安装ubuntu
  • arcgis for js范围内天地图高亮,其余底图灰暗
  • 排序算法--计数排序
  • JDK9新特性
  • 21天掌握javaweb-第2天:Spring Boot核心组件与Spring MVC基础
  • pgsql指令
  • scala的名次排名
  • linux c串口应用编程,参照golang里面的json.Marshal/json.Unmarshal
  • Python中的实用工具JSON解析
  • SpringMVC工作原理【流程图+文字详解SpringMVC工作原理】
  • 前海湾地铁的腾通数码大厦背后的临时免费停车点探寻
  • Ps:存储 Adobe PDF - 一般
  • 区分 Hive on Spark 和 Spark on Hive
  • 大数据 MapReduce基础实战
  • 基于Java Springboot Vue3图书管理系统
  • 港科夜闻 |香港科大推出 InvestLM生成式人工智能平台,支持金融中小企应用AI技术潜力...
  • 【docker】docker常用命令汇总
  • SpringCloud 详解
  • 数据分析的尽头是web APP?
  • 使用C#开发VTK笔记(二)Part1-VTK系统结构解析
  • 使用Github Action将Docker镜像转存到阿里云私有仓库,供国内服务器使用,免费易用
  • TouchGFX源码分析1---(Event类 和Click Event类)
  • C++多态的实现原理
  • 最短距离和路径问题 ford