首页 > 编程语言 >「代码随想录算法训练营」第二十六天 | 贪心算法 part4

「代码随想录算法训练营」第二十六天 | 贪心算法 part4

时间:2024-08-01 22:06:49浏览次数:9  
标签:vector end int 随想录 算法 points part4 https 区间

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

题目链接:https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/
题目难度:中等
文章讲解:https://programmercarl.com/0452.用最少数量的箭引爆气球.html
视频讲解:https://www.bilibili.com/video/BV1SA41167xe
题目状态:有点思路,但是没通过,靠ChatGPT通过

思路:

首先看一下题目的大致意思,如下图:

image

首先要通过气球的终点来进行排序,然后初始化箭的个数为1,因为至少会有一支箭,之后判断下一个气球的开头位置是否小于前一个气球的结尾,若大于,则箭的个数要加1,直到遍历结束。

代码:

class Solution {
public:
    int findMinArrowShots(vector<vector<int>>& points) {
        if (points.empty()) return 0;
        
        // Sort the points based on the end position of the balloons
        sort(points.begin(), points.end(), [](const vector<int>& a, const vector<int>& b) {
            return a[1] < b[1];
        });
        
        int res = 1; // At least one arrow is needed
        int end = points[0][1];
        
        for (int i = 1; i < points.size(); i++) {
            // If the current balloon starts after the end of the previous balloon
            if (points[i][0] > end) {
                res++;
                end = points[i][1];
            }
        }
        
        return res;
    }
};

435. 无重叠区间

题目链接:https://leetcode.cn/problems/non-overlapping-intervals/
题目难度:中等
文章讲解:https://programmercarl.com/0435.无重叠区间.html
视频讲解:https://www.bilibili.com/video/BV1A14y1c7E1
题目状态:看题解

思路:

首先根据每个区间的末尾位置来排序,若末尾的位置比下一个区间的开头要小,则说明这两个区间没有重叠,记录一下无重叠区间的个数,然后继续遍历,直到遍历结束,返回有重叠的个数。

代码:

class Solution {
public:
    // 按照区间右边界排序
    static bool cmp (const vector<int>& a, const vector<int>& b) {
        return a[1] < b[1];
    }
    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;
    }
};

763. 划分字母区间

题目链接:https://leetcode.cn/problems/partition-labels/
题目难度:中等
文章讲解:https://programmercarl.com/0763.划分字母区间.html
视频讲解:https://www.bilibili.com/video/BV18G4y1K7d5
题目状态:看题解

思路:

记录每一个字符的最远出现位置,然后定义一个区间,遍历在该区间中的字符最远出现的位置,若最后遍历到的位置正好为其区间中所含字符的最远位置,说明找到了该区间,更新下一个区间的开头为当前区间的下一个位置,继续遍历。

代码:

class Solution {
public:
    vector<int> partitionLabels(string S) {
        int hash[27] = {0}; // i为字符,hash[i]为字符出现的最后位置
        for (int i = 0; i < S.size(); i++) { // 统计每一个字符最后出现的位置
            hash[S[i] - 'a'] = i;
        }
        vector<int> result;
        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;
            }
        }
        return result;
    }
};

标签:vector,end,int,随想录,算法,points,part4,https,区间
From: https://www.cnblogs.com/frontpen/p/18337634

相关文章

  • 基于Python+Django协同过滤算法的招聘信息推荐系统设计与实现(源码+数据库+讲解)
    文章目录前言详细视频演示项目运行截图技术框架后端采用Django框架前端框架Vue可行性分析系统测试系统测试的目的系统功能测试数据库表设计代码参考数据库脚本为什么选择我?获取源码前言......
  • 选择排序算法
    在Java中实现选择排序算法,首先需要理解其基本思想和步骤。选择排序是一种简单直观的排序算法,其核心思想是每次从未排序的数据元素中找到最小(或最大)的一个元素,并将其放到已排序序列的末尾。基本步骤初始化:设置一个未排序区间的起始位置为0。查找最小值:从当前未排序区间中找到......
  • 「代码随想录算法训练营」第二十五天 | 贪心算法 part3
    134.加油站题目链接:https://leetcode.cn/problems/gas-station/题目难度:中等文章讲解:https://programmercarl.com/0134.加油站.html视频讲解:https://www.bilibili.com/video/BV1jA411r7WX题目状态:没有思路,学习题解思路一:全局最优解首先将所有路径的加油量和耗油量加一起......
  • 分词算法:自然语言处理中的关键技术
    分词算法:自然语言处理中的关键技术大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!分词(Tokenization)是自然语言处理(NLP)中的一项基础技术,旨在将文本拆分成有意义的单位,如单词或词组。分词在文本分析、信息检索、机器翻译等应用中发挥着重要作用。本文将介......
  • 代码随想录Day2
    209.长度最小的子数组给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其总和大于等于target的长度最小的子数组$[nums_l,nums_{l+1},...,nums_{r-1},nums_r]$,并返回其长度。如果不存在符合条件的子数组,返回0。示例1:输入:target=7,nums=......
  • JVM—垃圾收集算法和HotSpot算法实现细节
    1、分代回收策略分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。分代垃圾回收采用分治的思想,进行代的划分,把不同生命周期放在不同代上,不同代采用最适合它的垃圾回收方法进行回收。......
  • 冒泡排序的具体思想和算法实现以及改进
    冒泡排序——稳定算法从小到大排序:0~length-1对比a[0]和a[1],如果前一个大于后一个,交换位置。对比a[1]和a[2],如果前一个大于后一个,交换位置。对比a[2]和a[3],如果前一个大于后一个,交换位置。...对比a[length-2]和a[length-1],如果前一个大于后一个,交换位置。第一轮结果下......
  • 【算法】浅析线性规划算法【附完整示例】
    线性规划算法:优化资源配置,提升经济效益1.引言在现代社会,资源优化配置是提高经济效益的关键。线性规划算法作为一种优化工具,广泛应用于经济学、工程学、管理学等领域。本文将带你了解线性规划算法的原理、使用方法及其在实际应用中的意义,并通过代码示例和图示帮助大家更好......
  • 选择插入排序改进思路加算法实现
    首先默认第一个元素是已排序的,剩下元素是待排序的,从第二个元素开始遍历取出待排序区域的第一个元素element和已排序区域的最后一个元素a[j]往前开始比较大小若待排元素大于等于最后一个元素则直接跳出循环将待排元素赋值给a[j+1]若待排元素小于最后一个元素将最后一个元......
  • 折半插入排序算法思想及代码实现
    折半插入排序(BinaryInsertionSort)是插入排序算法的一种优化版本。插入排序的基本思想是将一个记录插入到已经排序好的有序表中,从而得到一个新的、记录数增加1的有序表。传统的插入排序在寻找插入位置时,采用的是顺序比较的方式,即逐个与有序表中的元素进行比较,直到找到比待插入......