首页 > 其他分享 >(36/60)无重叠区间、划分字母区间、合并区间

(36/60)无重叠区间、划分字母区间、合并区间

时间:2024-03-05 18:25:06浏览次数:23  
标签:vector right 重叠 int 36 60 intervals 区间

无重叠区间

leetcode:435. 无重叠区间

贪心法

思路

去掉最少的区间数就是最少重叠区间对的个数。(成对的算,因为一对里面需要去掉一个)

类似射气球的处理方式。

左边界法:

  1. 按左边界从小到大排序。

  2. 遍历每个元素。取当前元素右边界为right判断是否重叠。

    如果[i]right > [i+1]left,重叠,再判断是否[i]right > [i+1]right,如果是,右边界更新。(总是更新为一对重叠区间里最小的)

    重叠统一i++(继续判断下一个),count++(重叠区间对多一个)。

复杂度分析

时间复杂度:O(NlogN)。

空间复杂度:O(logN)。(排序)

注意点

代码实现

左区间排序法:

class Solution {
public:
    // 计算重叠区间个数
    static bool cmp(vector<int>& a,vector<int>& b){
        return a[0] < b[0];
    }
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        sort(intervals.begin(),intervals.end(),cmp);
        int count = 0;
        for(int i = 0;i < intervals.size();i++){
            int right = intervals[i][1];
            while(i < intervals.size() - 1 && right > intervals[i + 1][0] ){
                if(right > intervals[i+1][1]) right = intervals[i + 1][1];
                count++;
                i++;
            }
        }
        return count;
    }
};

划分字母区间

leetcode:763. 划分字母区间

贪心法

思路

  1. 遍历一遍s,建立出现最远下标映射表(数组)

  2. 根据区间遍历,遍历过程中更新区间右边界为区间内最远下标,

    如果遍历到了区间右边界,说明已经实现了区间字符只出现在区间内,收获结果(区间长度)

复杂度分析

时间复杂度:O(N)。

空间复杂度:O(1)。26个字母的映射数组。

注意点

代码实现

class Solution {
public:
    // 1. 遍历一遍s,建立出现最远下标映射表(数组)
    // 2. 根据区间遍历,遍历过程中更新区间右边界为区间内最远下标,
    //    如果遍历到了区间右边界,说明已经实现了区间字符只出现在区间内,收获结果(区间长度)
    vector<int> partitionLabels(string s) {
        vector<int> result;
        int hash[27] = {0};
        for(int i = 0;i < s.size();i++) hash[s[i] - 'a'] = i;
        int left = 0;
        int right = 0;
        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;   // 更新left
            }
        }

        return result;
    }
};

合并区间

leetcode:56. 合并区间

贪心法

思路

和射气球、无重叠区间类似,只是右边界每次更新为最大值。

  1. 按左边界从小到大排序。

  2. 遍历记录当前元素左右边界。

    循环处理right > intervals[i+1][0],重叠的情况,每次更新right为两者最大值。

    直到不再重叠时,收获left、right结果。

复杂度分析

时间复杂度:O(NlogN)。排序

空间复杂度:O(N)。(最差情况下N个元素都不重叠,结果集N个元素)

注意点

代码实现

class Solution {
public:
    // 排序
    // 如果有重叠,更新
    static bool cmp(vector<int>& a,vector<int>& b){
        return a[0] < b[0];
    }
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        sort(intervals.begin(),intervals.end(),cmp);
        vector<vector<int>> result;
        vector<int> temp;
        int left = 0;
        int right = 0;
        for(int i = 0;i < intervals.size();i++){
            temp.clear();
            left = intervals[i][0];
            right = intervals[i][1];
            while(i < intervals.size() - 1 && right >= intervals[i + 1][0]){
                right = max(right,intervals[i+1][1]);
                i++;
            }
            temp.push_back(left);
            temp.push_back(right);
            result.push_back(temp);
        }

        return result;
    }
};

标签:vector,right,重叠,int,36,60,intervals,区间
From: https://www.cnblogs.com/tazdingo/p/18054608

相关文章

  • (34/60)柠檬水找零、根据身高重建队列、用最少数量的箭引爆气球
    柠檬水找零leetcode:860.柠檬水找零贪心法思路遍历一遍数组,只关注面值5、10的钞票的数量每轮判断:如果是5,five++;如果是10,判断还有没有5,有的话five--;如果是20,检查有没有一张10、一张5,ten--,five--。或者三张5,five-=3。贪心:先消耗面值10的钞票,因为它更万能。复杂度分析时间......
  • 1-8高灵敏度电容式水位检测芯片VK36W系列 电容式触摸IC原厂【FAE技术支持】
     产品型号:VK36W1D产品品牌:VINKA/永嘉微电封装形式:SOT23-6产品年份:新年份深圳市永嘉微电科技有限公司,原厂直销,原装现货更有优势!工程服务,技术支持,让您的生产高枕无忧!量大价优,保证原装正品。您有量,我有价!概述VK36W1D具有1个触摸检测通道,可用来检测水从无到有和水从有到无的......
  • QC3.0快充识别芯片FP6601Q:电子工程师的首选,兼容QC2.0与平芯微技术
    概述FP6601Q是一款智能充电管理芯片,具有出色的协议识别功能,可以自动识别接入的充电设备并调整输出电压,以满足不同设备的充电需求。它支持BC1.2、Apple、SamsungAFC、华为FCP/SCP、ClassA、QC3.0和QC2.0等多种充电协议,适用于苹果、三星、华为等多种品牌设备的快速充电。同时,它还......
  • 代码随想录算法训练营第三十六天 | 56. 合并区间,763.划分字母区间,435. 无重叠区间
    435.无重叠区间 已解答中等 相关标签相关企业 给定一个区间的集合 intervals ,其中 intervals[i]=[starti,endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。 示例1:输入:intervals=[[1,2],[2,3],[3,4],[1,3]]输出:1解......
  • P5609 [Ynoi2013] 对数据结构的爱
    题面传送门好像搞了个神秘做法。考虑离线扫描线,用一个fhq-Treap维护所有的询问现在长什么样,然后每次操作就整体加\(A_i\),\(\geqp\)的减去\(p\),这个可以分裂之后打整体标记,然后用那个值域相交的fhq-Treap合并实现。然后你发现这样就过了。构造一下卡不掉,于是考虑给这个......
  • P3369 【模板】普通平衡树
    原题链接题解1stl模拟,注意lowerbound的效果和pos的返回值code1#include<bits/stdc++.h>usingnamespacestd;vector<int>a;intmain(){intn;cin>>n;while(n--){intop,x;cin>>op>>x;if(op==1)a.inser......
  • 36C++语言级的四种类型转换
    C++语言级的四种类型转换const_cast:去掉常量属性的类型转换static_cast:提供编译器认为安全的类型转换reinterpret_cast:类似C风格的强制类型转化dynamic_cast:主要用在继承结构中,可以支持RTTI类型识别的上下转换#include<iostream>usingnamespacestd;classBas......
  • 代码随想录算法训练营第三十六天| ● 435. 无重叠区间 ● 763.划分字母区间 ● 56.
    无重叠区间 题目链接:435.无重叠区间-力扣(LeetCode)思路:我的思路是先将所有区间按左端点从小到大排序,左端点相同时右端点从小到大排序。接下来遍历数组,如果下一个区间与该区间有重叠部分,count加1,同时遍历下下一个区间(下一个区间被视为删除),同时如果下一个区间被包含在该区间中,......
  • Luogu P1220 关路灯 题解 [ 蓝 ][ 区间dp ]
    关路灯题目描述某一村庄在一条路线上安装了\(n\)盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少)。老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯。为了给村里节省电费,老张记录下了每盏路灯的位置和功率,他每次关......
  • 246. 区间最大公约数
    #include<cstdio>#include<cstring>#include<iostream>#include<algorithm>usingnamespacestd;typedeflonglongLL;constintN=500010;intn,m;LLw[N];structNode{intl,r;LLsum,d;}tr[N*4];LLgcd(LL......