【代码随想录】【算法训练营】【第36天】[452]用最少数量的箭引爆气球 [435]无重叠区间 [763]划分字母区间

前言

思路及算法思维,指路 代码随想录。
题目来自 LeetCode。

day 36,周三,最难坚持的一天~

题目详情

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

题目描述

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

解题思路

前提:区间可能重叠
思路:贪心算法:按照起始位置排序,一支箭尽可能射多的气球。
重点:判断当前弓箭终止范围。

代码实现

C语言
贪心思维

局部最优:当气球出现重叠,一起射,所用弓箭最少。
全局最优:把所有气球射爆所用弓箭最少。
为了让气球尽可能的重叠,需要对数组进行排序。
如果气球重叠了,重叠气球中右边边界的最小值 之前的区间一定需要一个弓箭。

int cmp(const void *p1, const void *p2)
{
    int *pp1 = *(int **)p1;
    int *pp2 = *(int **)p2;
    // 按照起始位置排序, 相同起始位置按终止位置排序
    if (pp1[0] > pp2[0]) {
        return 1;
    }
    else if (pp1[0] == pp2[0]) {
        if (pp1[1] > pp2[1]) {
            return 1;
        }
    }
    return 0;
}

int findMinArrowShots(int** points, int pointsSize, int* pointsColSize){
    // 按照起始位置排序, 相同起始位置按终止位置排序
    qsort(points, pointsSize, sizeof(int *), cmp);
    
    // 至少需要一支箭
    int count = 1;
    int curRange = points[0][1];
    for (int i = 1; i < pointsSize; i++) {
        // 判断是否需要使用下一只弓箭:当前射箭范围是否与当前数组范围有交集
        if (curRange < points[i][0]) {
            count++;
            curRange = points[i][1];
        }
        // 判断当前数组范围是否会缩小当前射箭范围
        if (curRange > points[i][1]) {
            curRange = points[i][1];
        }
    }
    return count;
}

[435] 无重叠区间

题目描述

435 无重叠区间
435 无重叠区间

解题思路

前提:区间可能重叠
思路:贪心算法:按照起始位置排序,判断区间是否重复,去除重复区间时去除更大的区间,留下较小的区间。
重点:判断当前区间终止范围。

代码实现

C语言
起始位置排序,判断重复区间

按照起始位置排序,起始位置相同按照终止位置排序,判断区间是否重复,去除重复区间时去除更大的区间,留下较小的区间

int cmp(const void *p1, const void *p2)
{
    int *pp1 = *(int **)p1;
    int *pp2 = *(int **)p2;
    return pp1[0] == pp2[0] ? pp1[1] - pp2[1] : pp1[0] - pp2[0];
}

int eraseOverlapIntervals(int** intervals, int intervalsSize, int* intervalsColSize) {
    // 按照起始位置排序,起始位置相同按照终止位置排序
    qsort(intervals, intervalsSize, sizeof(int *), cmp);
    int count = 0;
    int endNum = intervals[0][1];
    // 判断区间是否重复,去除重复区间时去除更大的区间,留下较小的区间
    for (int i = 1; i < intervalsSize; i++) {
        // 判断起始位置与之前终止位置是否重叠
        if (endNum > intervals[i][0]) {
            count++;
        }
        else {
            endNum = intervals[i][1];
        }
        // 更新终止位置
        if (endNum > intervals[i][1]) {
            endNum = intervals[i][1];
        }
    }
    return count;
}
终止位置排序,判断非交叉区间

按照终止位置排序,终止位置相同按照起始位置排序,判断非重复区间的个数,需要移除区间数量即为重复区间个数,即总区间个数 - 非重复区间个数

int cmp(const void *p1, const void *p2)
{
    int *pp1 = *(int **)p1;
    int *pp2 = *(int **)p2;
    return pp1[1] == pp2[1] ? pp1[0] - pp2[0] : pp1[1] - pp2[1];
}

int eraseOverlapIntervals(int** intervals, int intervalsSize, int* intervalsColSize) {
    // 按照终止位置排序,终止位置相同按照起始位置排序
    qsort(intervals, intervalsSize, sizeof(int *), cmp);
    int count = 1;
    int endNum = intervals[0][1];
    // 判断非重复区间的个数
    for (int i = 1; i < intervalsSize; i++) {
        // 判断起始位置与之前终止位置是否重叠
        if (endNum <= intervals[i][0]) {
            count++;
            endNum = intervals[i][1];
        }
    }
    // 需要移除区间数量即为重复区间个数,即总区间个数 - 非重复区间个数
    return intervalsSize - count;
}

[763] 划分字母区间

题目描述

763 划分字母区间
763 划分字母区间

解题思路

前提:同一字母处于同一子字符串中
思路:要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点。
重点:确定分割点的位置,经过的每个字符串的最远位置。

代码实现

C语言
贪心思维

统计每个字母最后出现的位置;圈字符,找分割点;遍历到当前元素出现的最远位置,即为分割点。

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

#define LETTERS_MAX_NUMS  (26)

int* partitionLabels(char* s, int* returnSize) {
    int sLen = strlen(s);
    int range[LETTERS_MAX_NUMS];
    // 统计每个字母最后出现的位置
    for (int i = 0; i < sLen; i++) {
        range[s[i] - 'a'] = i;   
    }
    // 输出初始化
    int *ans = (int *)malloc(sizeof(int) * LETTERS_MAX_NUMS);
    int ansSize = 0;
    // 划分尽可能多的片段, 每个片段尽可能短,但是要包含所有同一字母
    // 圈字符,找分割点
    int left = 0;
    int right = 0;
    for (int i = 0; i < sLen; i++) {
        // 缓存当前元素的最远位置
        if (right < range[s[i] - 'a']) {
            right = range[s[i] - 'a'];
        }
        // 遍历到当前元素出现的最远位置,即为分割点
        if (i == right) {
            ans[ansSize] = i - left + 1;
            ansSize++;
            left = i + 1;
        }
    }
    *returnSize = ansSize;
    return ans;
}

今日收获

  1. 贪心算法:不太能想到的思路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/715891.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【探索Linux命令行】从基础指令到高级管道操作的介绍与实践

目录 man 指令&#xff08;说明&#xff09; 介绍 cp 指令&#xff08;复制&#xff09; ​编辑 mv 指令&#xff08;移动&#xff09; ​编辑 cat 指令&#xff08;类似cout&#xff09; less&#xff08;查找&#xff09; head & tail&#xff08;打印&#xff…

【CT】LeetCode手撕—88. 合并两个有序数组

目录 题目1- 思路2- 实现⭐88. 合并两个有序数组——题解思路 2- ACM实现 题目 原题连接&#xff1a;88. 合并两个有序数组 1- 思路 模式识别 模式1&#xff1a;两个有序数组合并 ——> 双指针模式2&#xff1a;返回结果填充到 nums1[mn] ——> 需要开辟新的数组空间 …

Linux shell 重定向输入和输出

Linux shell 重定向输入和输出 1. Standard I/O streams2. Redirecting to and from the standard file handles (标准文件句柄的重定向)2.1. command > file2.2. command >> file2.3. command 2> file2.4. command 2>> file2.5. command < file2.6. comm…

餐饮食堂安全守护者:可燃气体报警器故障处理与检测要点解析

在餐饮食堂中&#xff0c;可燃气体报警器的正常运行对于预防火灾和保障人员安全至关重要。 接下来&#xff0c;佰德将围绕可燃气体报警器的故障现象识别、原因排查、安全操作准则、专业工具与备件、故障处理步骤、验证与测试以及维护与保养建议等方面进行详细阐述&#xff0c;…

VS2022打开.netcore2.2 问题解决

1.vs2022运行时一直提示异常 2.解决方法&#xff0c;双击当前的项目修改xxxx.csproj文件 把当前的版本修改为2.2.0即可重新编译运行

低代码开发平台

a.本质&#xff1a;降本增效的体系 1.强制统一组件库复用 2.提升系统一致性 3.降低开发资源投入 一、强制统一组件库复用&#xff1a;物料堆的建立 物料堆的形态&#xff1a;直联、整合 1.直联必须一层嵌套一层&#xff1a;el-form el-form-item el-input 2.整合是经过优…

快慢指针技巧

快慢指针技巧 在说快慢指针之前&#xff0c;我们先说一下双指针。 双指针 双指针&#xff1a;使用两个指针来解决问题。 所谓的指针其实就是指数组的下标&#xff0c;或者链表的节点的地址。 我们以数组为例介绍一下。 有两个指针分别存储着数组的两个下标&#xff0c;这就…

秋招突击——6/15——复习{(树形DP)树的最长路径,(单调队列优化DP)——最大子序和,无重复最长子串}——新作{四数之和}

文章目录 引言复习树形DP——树的最长路径实现代码答疑 单调队列优化DP——最大子序和个人实现思路参考思路分析实现代码 无重复最长字串思路分析实现代码 新作四数之和实现思路需要注意的问题 参考代码分析思路实现代码 总结 引言 今天好好看看树的最长的路径&#xff0c;自己…

JavaWeb之初识Tomcat

Tomcat 轻量级应用服务器、JSP、Servlet Tomcat目录结构 在IDEA中创建web项目 在这里不使用maven构建项目&#xff0c;这种方式后面会更新 新建一个java项目File -> Project Settings -> Facets -> -> Web -> OK ( 此时src目录下有一个web目录 )Edit ->…

39、基于深度学习的(拼音)字符识别(matlab)

1、原理及流程 深度学习中常用的字符识别方法包括卷积神经网络&#xff08;CNN&#xff09;和循环神经网络&#xff08;RNN&#xff09;。 数据准备&#xff1a;首先需要准备包含字符的数据集&#xff0c;通常是手写字符、印刷字符或者印刷字体数据集。 数据预处理&#xff1…

ElasticSearch + kibana:类型声明

当我们使用 kibana 创建索引时&#xff0c;如果不申明数据类型&#xff0c;默认字符串赋予 text类型&#xff0c;如下图所示 接下来我们继续创建多条数据如下&#xff1a; 下面我们来检索下&#xff1a; 通过以上两个案例我们发现&#xff0c;使用 match 模糊查询 li-3 明明…

智利企鹅濒临灭绝,回顾曾仕强的2025年预言!实干才是硬道理——早读(逆天打工人爬取热门微信文章解读)

你相信我们5000年凝结的精华易经吗&#xff1f; 引言Python 代码第一篇 洞见 有人晒出高考后家长支出清单&#xff0c;我觉得是时候告诉孩子挣钱的真相了第二篇 视频新闻结尾 引言 昨天有点破了 看小视频不小心看过头了 大概看了有2个小时 才醒悟过来 再接再厉呀&#xff01; …

vue3中如何使用pinia -- pinia使用教程(一)

vue3中如何使用pinia -- pinia使用教程&#xff08;一&#xff09; 安装使用创建 store使用 store访问修改 store 使用组合式 api 创建 store -- setup storepinia 和 hook 的完美结合如何解决上面的问题 使用 hook 管理全局状态和 pinia 有何优缺点&#xff1f;参考小结 pinia…

哈喽GPT-4o——对GPT-4o 文本创作的思考与看法

目录 用法1&#xff1a;创作小说用法2&#xff1a;创作散文用法3&#xff1a;创作诗歌1、古诗2、现代诗 用法4&#xff1a;创作儿童故事用法5&#xff1a;创作剧本 大家好&#xff0c;我是哪吒。 都说ChatGPT4o是目前文本创作的最强大模型&#xff0c;它都可以用于哪些方面的文…

ArcGIS 10.2软件安装包下载及安装教程!

今日资源&#xff1a;ArcGIS 适用系统&#xff1a;WINDOWS 软件介绍&#xff1a; ArcGIS是一款专业的电子地图信息编辑和开发软件&#xff0c;提供一种快速并且使用简单的方式浏览地理信息&#xff0c;无论是2D还是3D的信息。软件内置多种编辑工具&#xff0c;可以轻松的完成…

VirtualHere 允许通过网络远程使用 USB 设备,就像本地连接一样!

传统上&#xff0c;USB 设备需要直接插入计算机才能使用。有了 VirtualHere&#xff0c;就不再需要这样做&#xff0c;网络本身就变成了传输 USB 信号的电缆&#xff08;也称为 USB over IP、USB/IP、USB over WiFi、USB over Ethernet、USB 设备服务器&#xff09;。 此 USB …

Google谈出海:品牌「性价比」转向「心价比」

Google Marketing Live中国站活动现场 越来越多的中国全球化品牌基于对全球消费和海外地区的深刻洞察&#xff0c;不断提升产品研发和迭代能力&#xff0c;在海外消费者心中塑造「中国质造」和「中国智造」的新形象。2023年6月15日&#xff0c;凯度与Google合作发布《2023 凯…

JavaFX GridPane布局

网格布局 GridPane通常用于布局&#xff1a;表单布局 GridPane可以在行&#xff0c;列或单元格级别指定约束。 例如&#xff0c;我们可以设置包含输入文本字段的第二列&#xff0c;以在窗口调整大小时调整大小。 使用Java FX创建表格的时候&#xff0c;这个布局非常方便。 包…

开源低代码平台,JeecgBoot v3.7.0 里程碑版本发布

项目介绍 JeecgBoot是一款企业级的低代码平台&#xff01;前后端分离架构 SpringBoot2.x&#xff0c;SpringCloud&#xff0c;Ant Design&Vue3&#xff0c;Mybatis-plus&#xff0c;Shiro&#xff0c;JWT 支持微服务。强大的代码生成器让前后端代码一键生成! JeecgBoot引领…

7大功能特色 让这款信创传输软件受众行业青睐

信创传输软件&#xff0c;顾名思义&#xff0c;也就是能够支持信创环境的文件传输系统&#xff0c;并且需要具备强大的功能&#xff0c;可以满足各种复杂的传输需求。 这种软件可能具有以下特点和功能&#xff1a; 1、兼容性&#xff1a;能够与信创环境中使用的硬件设备、网络…