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

news2024/11/24 21:01:03

前言

思路及算法思维,指路 代码随想录。
题目来自 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. 贪心算法:不太能想到的思路。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

对接钉钉Stream模式考勤打卡相关事件的指南

钉钉之前的accessToken是公司级别的&#xff0c;现在的accessToken是基于应用的&#xff0c;接口的权限也是基于应用的。所以第一步是在钉钉开放平台&#xff08;https://open-dev.dingtalk.com/&#xff09;创建一个应用。 创建好应用之后&#xff0c;因为我们后续还需要调用钉…

分布式事务seata之AT与TCC模型

1. seata分布式事务简介 seata是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。 Seata提供了AT、TCC、SAGA和XA事务模型&#xff0c;为用户打造一站式的分布式解决方案。 简单来说&#xff0c;Seata就是针对主流事务解决方案的封装…

Unity:Text-TextMeshPro 不显示中文

共计四步&#xff1a; 一、去C盘复制一份字体&#xff1a; C:\Windows\Fonts二、粘贴到你的项目里&#xff08;任意文件位置&#xff09;&#xff0c;得到“MSYH”&#xff1a; 三、右键字体文件&#xff0c;依次点击create–>TextMeshPro–>FontAsset&#xff1a; …

visdom使用时所遇的问题及解决方法

最近在用visdom进行可视化的过程中&#xff0c;虽然可有效的避免主机拒绝访问&#xff08;该问题的解决方法&#xff0c;请参考深度学习可视化工具visdom使用-CSDN博客&#xff09;即在终端输入python -m visom.server 1.训练过程中visdom出现ValueError: too many file descr…

科技项目验收测试必须进行吗?软件测试公司推荐

科技项目验收测试是指在科技项目开发周期中&#xff0c;对项目完成后进行的一种测试和评估工作。它的目的是验证项目是否达到预期的要求&#xff0c;并确保项目交付给客户前达到预期的质量标准。 一、科技项目验收测试的必要性   科技项目验收测试是项目管理中不可或缺的一个…

5.5 Python 迭代器与生成器

文章目录 1. 三元表达式1.1 格式1.2 示例1.3 嵌套 2. 生成式2.1 列表生成式2.2 字典生成式2.3 集合生成式2.4 元组生成式 3. 可迭代对象4. 迭代器4.1 迭代器的优缺点4.2 迭代器的惰性机制4.3 生成迭代器4.4 文本IO包装器4.5 字符串迭代器4.6 列表迭代器4.7 字典键迭代器4.8 元组…

怎么改图片尺寸更方便?在线图片改大小的使用方法

图片怎么快速改尺寸呢&#xff1f;在网上传图或者做其他用途时&#xff0c;经常会对图片的尺寸有要求&#xff0c;当拍摄或者制作的图片太大或者太小时&#xff0c;都会导致图片的无法正常使用&#xff0c;那么就需要按照规定将图片改大小之后才能正常使用。 在遇到图片修改大…

ui自动化中,隐式等待和显示等待什么时候使用

隐式等待 在页面刷新加载时&#xff0c;页面元素还没有出来&#xff0c;这个时候如果去找元素就会找不到报错 或者点了一个菜单&#xff0c;页面加载时 用笨办法&#xff0c;就是用sleep等待固定的时间&#xff0c;这种浪费的时间比较多&#xff0c;就可以用隐式等待&#xf…

酷暑骄阳,热情似火丨deepin校园联盟走进湖北大学,共话开源新篇章

内容来源&#xff1a;deepin&#xff08;深度&#xff09;社区 炎炎夏日&#xff0c;骄阳似火&#xff0c;6月11日&#xff0c;deepin校园联盟湖北大学站交流活动如期举行。在湖北大学计算机与信息工程学院&#xff0c;deepin(深度)社区研发工程师王溢学为热情似火的学子们开展…

打造地下管廊智慧监测解决方案-守护城市生命线|计讯物联

方案背景 地下综合管廊是城市基础设施的关键部分&#xff0c;即在城市地下建造一个隧道空间&#xff0c;将电力、通信&#xff0c;燃气、供热、排水等各种工程管线集于一体&#xff0c;被视为城市的“生命线”。随着城市化进程的加快&#xff0c;地下管线的数量、种类和密度不断…

动态规划:最长重复子数组

本题不算难&#xff0c;但是如果直接想dp数组怎么定义的话就会头晕&#xff0c;先想递推公式的含义就知道为什么需要冗余的dp[0][0]了 class Solution {public int findLength(int[] nums1, int[] nums2) {int res 0;//1.确定dp数组含义int[][] dp new int[nums1.length1][nu…

不懂产品和工艺的小白能学好FMEA吗?

在制造业的广阔天地里&#xff0c;FMEA&#xff08;Failure Modes and Effects Analysis&#xff0c;失效模式与影响分析&#xff09;一直被视为质量控制的关键武器。然而&#xff0c;很多人认为只有懂产品和工艺的行家才能玩转FMEA&#xff0c;对于小白来说似乎遥不可及。今天…

智慧环保一体化平台简介

据悉&#xff0c;环保问题日益受到人们的关注&#xff0c;智慧环保一体化平台作为解决环保问题的有力工具&#xff0c;正逐渐走进人们的视野。朗观视觉智慧环保一体化平台通过整合各类环保资源&#xff0c;实现环境数据的实时监测、分析与管理&#xff0c;为环境保护提供智能化…

windows10蓝屏原因自检记录

背景 跑训练的过程中电脑自动重启了&#xff0c;为了满足长期训练的需要&#xff0c;研究一下死机原因 查看系统日志 右键我的电脑——管理——系统工具——事件查看器——系统 检索级别为错误的内容&#xff0c;在死机时间附近查找相关日志&#xff0c;发现如下日志 计算机…

【第六篇】SpringSecurity的权限管理

一、权限管理的实现 服务端的各种资源要被SpringSecurity的权限管理控制可以通过注解和标签两种方式来处理。 放开了相关的注解后在Controller中就可以使用相关的注解来控制了 JSR250注解 /*** JSR250*/ @Controller @RequestMapping("/user") public class UserC…

深度!千字长文拆解AI Agent ,浅谈国内AI Agent 现状

“现如今ChatGPT的热度逐渐褪去&#xff0c;而字节的扣子逐渐被越来越多的国人知晓&#xff0c;钉钉、百度、Dify等也纷纷涉足工作流功能&#xff0c;打开国内AI工作流to B市场。今天学姐将用通俗易懂的方式讲解AI Agent是什么&#xff0c;以及国内大厂做Agent的进展。大家不要…

机器人中roll/pitch/yaw angles 和Euler angles的区别

在机器人学和航空领域&#xff0c;roll、pitch、yaw angles&#xff08;滚转角、俯仰角、偏航角&#xff09;和Euler angles&#xff08;欧拉角&#xff09;是两个经常出现的概念&#xff0c;它们用于描述物体在三维空间中的姿态或方向。以下是对这两个概念的解释以及它们之间的…

DeepSpeed Monitoring Comm. Logging

Monitoring 支持多种后端&#xff1a;Tensorboard、WandB、Comet、CSV文件&#xff1b; TensorBoard例子&#xff1a; 自动监控&#xff1a;DeepSpeed自动把重要metric记录下来。只需在配置文件里enable相应的看板后端即可&#xff1a; {"tensorboard": {"enabl…

园区数字化运营管理平台的优势、价值有哪些?

​随着全球及我国数字经济的蓬勃发展&#xff0c;数字化转型已成为各行各业提升效率和竞争力的关键。园区作为区域经济发展的重要载体&#xff0c;数字化运营管理平台更是成为了推动园区经济高质量发展的重要工具。 随着园区数字化运营管理平台的而引入&#xff0c;为园区在运…

FISCO BCOS x GitLink,为国产开源技术生态注入新活力

作为中国领先的区块链底层平台之一&#xff0c;FISCO BCOS 自成立以来始终致力于推动国产开源区块链技术的应用和普及。近期&#xff0c;FISCO BCOS 将开源代码托管到CCF官方代码托管平台 GitLink &#xff08;确实开源&#xff09;&#xff0c;为国产开源技术生态注入新活力。…