首页 > 编程语言 >算法练习-day29

算法练习-day29

时间:2023-07-24 23:03:09浏览次数:35  
标签:arr vector day29 重叠 int 练习 算法 intervals 区间

贪心算法

435. 无重叠区间

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

实例:

算法练习-day29_贪心算法

思路:本题和452. 用最少数量的箭引爆气球做法非常类似,大家可以先看看我之前的文章。本题我们只需要统计重叠的区域,代码如下

C++代码:

    static bool cmp(vector<int>& left,vector<int>& right)
    {
        return left[0]<right[0];
    }
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        sort(intervals.begin(),intervals.end(),cmp);
        int count=0;
        for(int i=1;i<intervals.size();i++)
        {
            if(intervals[i-1][1]>intervals[i][0])//只需要判断两区域是否重合,重合了就++,然后重置右边界
            {
                count++;
                intervals[i][1]=min(intervals[i-1][1],intervals[i][1]);
            }
        }
        return count;
    }

763. 划分字母区间

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

注意:划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。返回一个表示每个字符串片段的长度的列表。

实例:

算法练习-day29_贪心算法_02

思路:本题其实和之前做过的一个找范围题类似,也是从头开始不断地扩大寻找范围,直到范围寻找结束,再保存该范围。本题也是类似,利用find函数搜索字符在整个字符串中的最远距离,以此作为基础,遍历这个临时的范围,在过程中,不断地寻找最大范围,直到跳出最大范围或者跳出字符串的范围,就说明结束便利了,可以存储字符串长度了

C++代码:

    int max(int a,int b)
    {
        if(a>b)
        {
            return a;
        }
        return b;
    }
    vector<int> partitionLabels(string s) {
        vector<int> arr;
        int i = 0;
        while (i < s.size())
        {
            int n = i;
            int maxSignal = s.rfind(s[i]);//我们先选出一个暂时的范围作为第一个字符串的长度
            while (i<s.size() && i<maxSignal)//在遍历过程中不断修改字符串的范围,直到其达到最大范围
            {
                i++;
                maxSignal = max(maxSignal, s.rfind(s[i]));
            }
            arr.push_back(maxSignal - n + 1);//跳出,说明找到了字符串的最大范围
            i++;
        }
        return arr;
    }

56. 合并区间

题意:以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

实例:

算法练习-day29_贪心算法_03

思路:本题主要和之前题目类似,都需要先排序,将左边小的排到前面,便于邻界重叠。我们先构建一个二维数组arr,用于存储重叠好的边界;先放入一个边界,然后for循环,如果两边界重叠,就需要取并集;如果不重叠,则需要先保存,然后循环上去再次判断是否需要改变边界。

C++代码:

    static bool cmp(vector<int>& left,vector<int>& right)
    {
        if(left[0]==right[0])
        {
            return left[1]<right[1];
        }
        return left[0]<right[0];
    }
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        sort(intervals.begin(), intervals.end(), cmp);
        vector<vector<int>> arr;
        arr.push_back(intervals[0]);//我们直接插入第一个区域,然后在第一个区域基础上修改边界
        int n = 0;//为了修改边界而定义的
        for (int i = 1; i<intervals.size(); i++)
        {
            if (arr[n ][1] >= intervals[i][0])//当有重合边界时,取它们的并集
            {
                arr[n][0] = min(arr[n][0], intervals[i][0]);
                arr[n][1] = max(arr[n][1], intervals[i][1]);
            }
            else//没有时,则直接保存
            {
                arr.push_back(intervals[i]);
                n++;
            }
        }
        return arr;
    }

标签:arr,vector,day29,重叠,int,练习,算法,intervals,区间
From: https://blog.51cto.com/u_15209404/6840428

相关文章

  • 文心一言 VS 讯飞星火 VS chatgpt (65)-- 算法导论6.5 4题
    四、在MAX-HEAP-INSERT的第2行,为什么我们要先把关键字设为-∞,然后又将其增加到所需的值呢?文心一言:在MAX-HEAP-INSERT算法的第二行将关键字设为-∞,是为了保持堆的性质。堆是一种二叉树结构,其中每个节点的值都大于或等于其子节点的值。在MAX-HEAP-INSERT算法中,我们需要......
  • Java-Day-36( 通过反射获取类的结构信息 + 通过反射访问类中的成员 + 章节练习 )
    Java-Day-36通过反射获取类的结构信息第一组:java.lang.Class类以下说的包含本类和父类——也包括超类等方法属性之类的若是输出时不加.getName,则都是输出:com.zyz.Zyz()publicclasstest{publicstaticvoidmain(String[]args){}@Testpubl......
  • 算法练习-day28
    贪心算法860.柠檬水找零题意:在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单bills支付的顺序)一次购买一杯。每位顾客只买一杯柠檬水,然后向你付5美元、10美元或20美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付5美元。注意,一开......
  • 我的第五次C语言练习
    今天写书上的练习。//第一章练习//intmain(void)//{// intinch;// floatcm;// inch=0;// scanf("%d",&inch);// cm=2.54*inch;// printf("cm=%f\n",cm);// return0;//}发现之前第一章还有练习没写,是将英尺转换为厘米,因为inch乘了个2.54,所以cm是小数,用的是flo......
  • MCU基于非对称算法的伪安全启动方案
    一、概述随着软件定义汽车理念的普及,汽车上代码量不断膨胀,功能不断智能化,用户体验不断升级。从传统汽车不需要联网,到职能汽车具有联网功能已是标配,汽车触网必将带来更多信息安全问题。汽车的信息安全问题比IT领域更加重要,因为可能危及生命安全。故国家也出台强标《汽车整车信息安......
  • JavaScript数据结构和算法简述——数组
    为什么先讲数组数据结构可以简单的被分为线性结构和非线性结构。线性结构大致包括:数组(连续存储);链表(离散存储);栈(线性结构常见应用,由链表或数组增删和改进功能实现);队列(线性结构常见应用,由链表或数组增删和改进功能实现);非线性结构大致包括:树;图;其中,数组是应用最广泛的数据存储结构。它被......
  • 第二届粤港澳大湾区(黄埔)国际算法算例大赛正式开启报名
    据悉,2023第二届“粤港澳大湾区(黄埔)国际算法算例大赛”(以下简称“大赛”)已于7月15日正式开赛。粤港澳大湾区(黄埔)国际算法算例大赛是受广州市黄埔区政府委托,由琶洲实验室(黄埔)于2022年创办的算法算例领域国际性赛事。旨在通过发挥实验室在数字经济领域的引领和带动作用,推动大湾......
  • 【智能优化算法】基于黄金莱维引导机制的阿基米德优化算法(MSAOA)求解单目标优化问题
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • R语言社区发现算法检测心理学复杂网络:spinglass、探索性图分析walktrap算法与可视化|
    原文链接:http://tecdat.cn/?p=24613最近我们被客户要求撰写关于社区发现算法的研究报告,包括一些图形和统计输出。我们在心理学网络论文中看到的一个问题是,作者有时会对其数据的可视化进行过度解释。这尤其涉及到图形的布局和节点的位置,例如:网络中的节点是否聚集在某些社区 ( ......
  • 基于KNN近邻分类的情感识别算法matlab仿真
    1.算法理论概述      情感识别是自然语言处理领域中的一个重要研究方向。本文介绍了一种基于KNN近邻分类的情感识别算法,该算法使用词袋模型提取文本特征向量,计算文本特征向量之间的距离,并使用加权投票的方法确定待分类文本的情感类别。本文详细介绍了算法的数学模型和实现......