【算法训练记录——Day36】

news2024/10/5 14:26:43

Day36——贪心Ⅳ

  • 1.leetcode_452用最少数量的箭引爆气球
  • 2.leetcode_435无重叠区间
  • 3.leetcode_763划分字母区间
  • 4.leetcode_

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

在这里插入图片描述
思路:看了眼题解,局部最优:当气球出现重叠,一起射,所用弓箭最少。全局最优:把所有气球射爆所用弓箭最少。如果真实的模拟射气球的过程,应该射一个,气球数组就remove一个元素,这样最直观,毕竟气球被射了。

但仔细思考一下就发现:如果把气球排序之后,从前到后遍历气球,被射过的气球仅仅跳过就行了,没有必要让气球数组remove气球,只要记录一下箭的数量就可以了。

	int findMinArrowShots(vector<vector<int>>& points) {
        int res = 1;
        sort(points.begin(), points.end());
        
        int preRight(points[0][1]);

        // for(auto i : points) {
        //     cout << i[0] << " " << i[1] << endl;
        // }
        // cout << "==========" << endl;
        for(int i = 1; i < points.size(); i++) {
            // cout << i << " " << preRight << endl;
            if(preRight < points[i][0]) {
                res++;
                preRight = points[i][1];
            } else {
                preRight = min(preRight, points[i][1]);
            }
        }
        return res;
    }

主要思路是每次都维护当前交集最小的边界,因为已经拍过序了。如果不相交,res++,然后更新当前位置能覆盖的最大边界,如果相交,就更新最小边界。和题解解法差不多

2.leetcode_435无重叠区间

在这里插入图片描述
思路:
怎么看是否重叠?同样还是排序,看是否相交(left > right)
2. 有重叠移除哪个?移除右边界大的那个

	static bool cmp(const vector<int>& v1, const vector<int>& v2) {
        if(v1[0] == v2[0]) return v1[1] < v2[1];
        return v1[0] < v2[0];
    }
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        sort(intervals.begin(), intervals.end(), cmp);

        // for(auto i : intervals)
        //     cout << i[0] << " " << i[1] << endl;
        
        int res = 0;
        int preRight = intervals[0][1];

        for(int i = 1; i < intervals.size(); i++) {
            if(intervals[i][0] < preRight) {
                preRight = min(preRight, intervals[i][1]); // 有重叠移除大边界
                res++;
            } else {
                preRight = intervals[i][1]; // 无重叠更新边界
            }
        }

        return res;
    }

看了眼题解,思路差不多,我这里选用左边界排序

3.leetcode_763划分字母区间

在这里插入图片描述
思路:整体思路和前两题差不多,区别在于,需要做转换。将同一字母划分在同一片段,遍历一次数组,保存字母出现的开始位置和结束位置,记录首字母位置信息,对保存的字母位置信息进行排序(排序是为了让开始位置连续,以便记录交集),若pre 和 cur 不相交,将之前的位置信息加入res中,更新新的左边界和右边界;相交,则更新边界

	static bool cmp(const vector<int>& v1, const vector<int>& v2) {
        if(v1[0] == v2[0]) return v1[1] < v2[1];
        return v1[0] < v2[0];
    }
public:
    vector<int> partitionLabels(string s) {
        vector<vector<int>> dp = {26, vector<int>{0, 0}};

        for(int i = 0; i < s.size(); i++) {
            int index = s[i]-'a';
            if(dp[index][0] == dp[index][1]) {
                dp[index][0] = i + 1;
            } else {
                dp[index][1] = i + 1;
            }
        }

        int preLeft = dp[s[0]-'a'][0];
        int preRight = dp[s[0]-'a'][1];
        
        sort(dp.begin(), dp.end(), cmp);

        vector<int> res;
        if(preRight == 0) preRight = preLeft;

        for(int i = 1; i < 26; i++) {
            if(dp[i][0] != 0) {
                if(dp[i][1] == 0) dp[i][1] = dp[i][0];
                // cout << (char)('a' + i) << " " << dp[i][0] << " " << dp[i][1] << endl;
                if(preRight >= dp[i][0]) {
                    preRight = max(preRight, dp[i][1]);
                } else {
                    // cout << "  " << preRight << " " << preLeft << endl;
                    res.push_back(preRight - preLeft + 1);
                    preLeft = dp[i][0];
                    preRight = dp[i][1];
                }
            }

        }
        res.push_back(preRight - preLeft + 1);

        return res;
    }

看了下题解,还有另一种方法:
每一个字母都有其最远出现位置,如果在一个区间内,当前位置等于所有字母最远出现位置,那么说明到达了分界点,即可写出如下代码

	vector<int> partitionLabels(string s) {
		vector<int> res;
		int hash[26] = {0};
		for(int i = 0; i < s.size(); i++) {
			// hash[s[i]-'a'] = max(hash[s[i]-'a'], i);
			hash[s[i]-'a'] = i; // 记录最远位置
		}
		int right = 0; // 记录当前区间最远位置
		int left = 0;
		for(int i = 0; i < s.size(); i++) {
			right = max(right, hash[s[i] - 'a']); // 更新最远位置
			if(i == right) {	// 到达最远位置
				res.push_back(right - left + 1);
				left = right + 1;	
			}	
		}
		return res;
	}

4.leetcode_

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

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

相关文章

【工具推荐】Nuclei

文章目录 NucleiLinux安装方式Kali安装Windows安装 Nuclei Nuclei 是一款注重于可配置性、可扩展性和易用性的基于模板的快速漏洞验证工具。它使用 Go 语言开发&#xff0c;具有强大的可配置性、可扩展性&#xff0c;并且易于使用。Nuclei 的核心是利用模板&#xff08;表示为简…

多机调度问题

#include<iostream> #include<string> using namespace std; struct work {int time;int number; }; int setwork0(int m,int n,int a[],struct work w[]) {int maxtime0;for(int i1; i<m; i){cout<<i<<"号设备处理作业"<<w[i].num…

AD9026芯片开发实录5-ADRV9026 - FAQ

1. What information should I provide to help speed resolution of my issue?  Please provide as much detail as possible including all of the detail described in the table below 2. What are the key specifications of ADRV9026 chip?  The ADRV9026 is a 4…

kafka学习笔记08

Springboot项目整合spring-kafka依赖包配置 有这种方式&#xff0c;就是可以是把之前test里的配置在这写上&#xff0c;用Bean注解上。 现在来介绍第二种方式&#xff1a; 1.添加kafka依赖&#xff1a; 2.添加kafka配置方式: 编写代码发送消息&#xff1a; 测试&#xff1a; …

ROS2自定义接口Python实现机器人移动

1.创建机器人节点接口 cd chapt3_ws/ ros2 pkg create example_interfaces_rclpy --build-type ament_python --dependencies rclpy example_ros2_interfaces --destination-directory src --node-name example_interfaces_robot_02 --maintainer-name "Joe Chen" …

【STM32】在标准库中使用定时器

1.TIM简介 STM32F407系列控制器有2个高级控制定时器、10个通用定时器和2个基本定时器。通常情况下&#xff0c;先看定时器挂在哪个总线上APB1或者APB2&#xff0c;然后定时器时钟需要在此基础上乘以2。 2.标准库实现定时中断 #ifndef __BSP_TIMER_H #define __BSP_TIMER_H#if…

计算机基础知识——C基础+C指针+char类型

指针 这里讲的很细 https://blog.csdn.net/weixin_43624626/article/details/130715839 内存地址&#xff1a;内存中每个字节单位都有一个编号&#xff08;一般用十六进制表示&#xff09; 存储类型 数据类型 *指针变量名&#xff1b;int *p; //定义了一个指针变量p,指向的数…

自研Eclipse插件的生成及安装和使用

说明&#xff1a; 本处是使用个人自研的Eclipse插件为例&#xff0c;创建了一个菜单式的插件组&#xff0c;插件组下&#xff0c;有一个生成右击Jakarta EE服务端点类后&#xff0c;生成端点对应的Restful客户端。有什么问题&#xff0c;欢迎大家交流&#xff01;&#xff01;…

仓库管理系统11--物资设置

1、添加用户控件 <UserControl x:Class"West.StoreMgr.View.GoodsTypeView"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc"http://schemas.openxm…

[小试牛刀-习题练]《计算机组成原理》之计算机系统概述【详解过程】

【计算机系统概述】 1、【冯诺伊曼结构】计算机中数据采用二进制编码表示&#xff0c;其主要原因是&#xff08;D&#xff09; I、二进制运算规则简单II、制造两个稳态的物理器件较为容易III、便于逻辑门电路实现算术运算 A.仅I、Ⅱ B.仅I、Ⅲ C.仅Ⅱ、Ⅲ D. I、Ⅱ、Ⅲ I…

redis 单节点数据如何平滑迁移到集群中

目的 如何把一个redis单节点的数据迁移到 redis集群中 方案&#xff1a; 使用命令redis-cli --cluster import 导入数据至集群 --cluster-from <arg>--cluster-from-user <arg> 数据源用户--cluster-from-pass <arg> 数据源密码--cluster-from-askpass--c…

Linux开发讲课20--- QSPI

SPI 是英语 Serial Peripheral interface 的缩写&#xff0c;顾名思义就是串行外围设备接口&#xff0c;一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&#xff0c;为 PCB 的布局上节省空间…

《SpringBoot+Vue》Chapter04 SpringBoot整合Web开发

返回JSON数据 默认实现 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>在springboot web依赖中加入了jackson-databind作为JSON处理器 创建一个实体类对象…

为什么Modbus链接/从机不通?From 摩尔信使MThings

为了回应用户平日里关于摩尔信使&#xff08;MThings&#xff09;使用过程中最常见的问题&#xff0c;包括“网络链接连不上”、“为什么不能增加串口”和“为什么从机不通”&#xff0c;我们在此统一介绍解决方法。 1、具备哪些通信能力 支持串口和网络两种通信方式。 需要…

我们后端程序员不是操作MyBatis的CRUD Boy

大家好&#xff0c;我是南哥。 一个对Java程序员进阶成长颇有研究的人&#xff0c;今天我们接着新的一篇Java进阶指南。 为啥都戏称后端是CRUD Boy&#xff1f;难道就因为天天怼着数据库CRUD吗&#xff1f;要我说&#xff0c;是这个岗位的位置要的就是你CRUD&#xff0c;你不…

FastAPI教程II

本文参考FastAPI教程https://fastapi.tiangolo.com/zh/tutorial Cookie参数 定义Cookie参数与定义Query和Path参数一样。 具体步骤如下&#xff1a; 导入Cookie&#xff1a;from fastapi import Cookie声明Cookie参数&#xff0c;声明Cookie参数的方式与声明Query和Path参数…

Hi3861 OpenHarmony嵌入式应用入门--LiteOS MessageQueue

CMSIS 2.0接口中的消息&#xff08;Message&#xff09;功能主要涉及到实时操作系统&#xff08;RTOS&#xff09;中的线程间通信。在CMSIS 2.0标准中&#xff0c;消息通常是通过消息队列&#xff08;MessageQueue&#xff09;来进行处理的&#xff0c;以实现不同线程之间的信息…

650V 1200V 碳化硅MOS TO247 封装 内阻30毫欧 40 80毫欧

650V 1200V 碳化硅MOS TO247 封装 内阻30毫欧 40 80毫欧

Java的IO体系

目录 1、Java的IO体系2、IO的常用方法3、Java中为什么要分为字节流和字符流4、File和RandomAccessFile5、Java对象的序列化和反序列化6、缓冲流7、Java 的IO流中涉及哪些设计模式 1、Java的IO体系 IO 即为 input 输入 和 output输出 Java的IO体系主要分为字节流和字符流两大类…

MySQL中的redo log 和 undo log

undo log和redo log 先引入两个概念&#xff1a; 当我们做了一些操作 (update/delete/insert)&#xff0c;提交事务后要操作MySql中的数据。 为了能够提升性能&#xff0c;引入了两块区域&#xff1a;内存结构和磁盘结构。 磁盘结构&#xff1a; 主要存储的就是数据页&#x…