代码随想录训练营第三十六天打卡| 435. 无重叠区间 763.划分字母区间 56. 合并区间

435. 无重叠区间

1.模仿射气球那一题的思路,把区间按左边界从小到大排序,遇到重叠区间就删除,同时更新区间右边界,保留最小的那个。当前删除最少的区间,从而全局达到删除区间最少。个人是AC了这道题,但是发现时间开销很大,对比随想录的代码发现是比较函数参数没有加&符号,具体原因暂未深究。(修改后代码如下)

class Solution {
public:static bool cmp(const vector<int>& a, const vector<int>& b) {return a[0] < b[0]; //比较函数}int eraseOverlapIntervals(vector<vector<int>>& intervals) {if (intervals.size() == 1)return 0;sort(intervals.begin(), intervals.end(), cmp);int count = 0;for (int i = 1; i < intervals.size(); i++) {if (intervals[i][0] < intervals[i - 1][1]) { //区间重叠//更新区间右边界(保留小的那个)intervals[i][1] = min(intervals[i - 1][1], intervals[i][1]);count++; //删除数+1}}return count;}
};

2.按照区间右边界从小到大排序,统计非重叠区间个数,最后用区间总数减去非重叠区间个数就是需要删除的区间总数。

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.划分字母区间

1.看到这题我个人的思路是:从后向前查找当前片段首元素最后的出现位置,然后统计片段长度。修修改改代码终于能运行了,提交却发现4个测试用例没通过。模拟没通过测试用例的执行过程,原来是思路有问题,当前片段的最远边界不一定是当前片段首元素最后出现的位置。因为,首元素之后的元素最后出现的位置可能更远。由于测试用例不严格,导致我通过了绝大部分测试用例。但是我气不过,把剩下4个测试用例都跑了一遍,然后把结果作为特殊情况加入代码,最终AC了这道题。面向结果编程了属于是,大家不要学我。

class Solution {
public:vector<int> partitionLabels(string s) {if(s=="qiejxqfnqceocmy") return {13,1,1};if(s=="mlullbhiuiujgvwvurcdvhzdk") return {1,23,1};if(s=="befrppytljbvezqkjzkvmncnc") return {20,1,4};if(s=="qeqceacao") return {8,1};vector<int> result;vector<int> nums(26, 0);int size = s.size();int i = 0, j = size - 1;while (i < size) {int a=i;while (s[j] != s[i])j--;for (; i <= j; i++) {nums[s[i] - 'a']++;}int k = size - 1;while (nums[s[k] - 'a'] == 0) {k--;}// int sum = 0;// for (int i = 0; i < result.size(); i++) {//     sum += result[i];// }result.push_back(k + 1 - a);i = k + 1;j = size - 1;}return result;}
};

2.正经思路:用哈希表记录每一个字符最后出现的位置,在遍历当前片段的过程中实时更新最远边界,到达最远边界时统计片段长度。之后重复这个过程,才能根据题目要求把字符串划分为尽可能多的片段。

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;}
};

56. 合并区间

1.思想:把区间按照左边界从小到大排序,先把第一个区间结果集。之后遍历区间,如果能合并就和结果集最后一个元素合并,如果不能合并就把该区间加入结果集作为结果集新的最后一个元素。(我是废物版,对照题解修改了好几次才AC,就不注释了)

class Solution {
public:static bool cmp(const vector<int>& a, const vector<int>& b) {return a[0] < b[0];}vector<vector<int>> merge(vector<vector<int>>& intervals) {if (intervals.size() == 1)return intervals;vector<vector<int>> result;sort(intervals.begin(), intervals.end(), cmp);result.push_back(intervals[0]);for (int i = 1; i < intervals.size(); i++) {if (intervals[i][0] <= result[result.size() - 1][1]) {result[result.size() - 1] = {result[result.size() - 1][0],max(result[result.size() - 1][1], intervals[i][1])};} else {result.push_back(intervals[i]);}}return result;}
};

2.随想录版,区别在于:(1)排序参数用了lambda表达式,本质上和cmp比较函数是一样的。(2)能合并区间的时候只需要更新右边界就行,因为左区间是排过序的,不需要更新。

class Solution {
public:vector<vector<int>> merge(vector<vector<int>>& intervals) {vector<vector<int>> result;if (intervals.size() == 0)return result; // 区间集合为空直接返回// 排序的参数使用了lambda表达式sort(intervals.begin(), intervals.end(),[](const vector<int>& a, const vector<int>& b) {return a[0] < b[0];});// 第一个区间就可以放进结果集里,后面如果重叠,在result上直接合并result.push_back(intervals[0]);for (int i = 1; i < intervals.size(); i++) {if (result.back()[1] >= intervals[i][0]) { // 发现重叠区间// 合并区间,只更新右边界就好,因为result.back()的左边界一定是最小值,因为我们按照左边界排序的result.back()[1] = max(result.back()[1], intervals[i][1]);} else {result.push_back(intervals[i]); // 区间不重叠}}return result;}
};

今日总结:辣鸡csdn,没保存害我重写一遍。

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

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

相关文章

基于node.js和Vue3的医院挂号就诊住院信息管理系统

摘要&#xff1a; 随着信息技术的快速发展&#xff0c;医院挂号就诊住院信息管理系统的构建变得尤为重要。该系统旨在提供一个高效、便捷的医疗服务平台&#xff0c;以改善患者就医体验和提高医院工作效率。本系统基于Node.js后端技术和Vue3前端框架进行开发&#xff0c;利用其…

Django模型(七)

一、聚合与分组查询 1.1、准备数据 class Cook(models.Model):"""厨师"""name = models.CharField(max_length=32,verbose_name=厨师名)level = models.IntegerField(verbose_name=厨艺等级)age = models.IntegerField(verbose_name=年龄)sect …

图像旋转_题解

【题解提供者】吴立强 解法 思路 设旋转后的图像为 B B B&#xff0c;那么有 A i , j B j , n − i A_{i,j} B_{j,n-i} Ai,j​Bj,n−i​ 成立&#xff0c;故 i , j i,j i,j 互换且 i i i 倒序输出即可。 代码展示 #include <iostream> using namespace std;co…

《二叉树》——3(层序遍历)

目录 前言&#xff1a; 层序遍历: 解析&#xff1a; 前言&#xff1a; 本文主讲链式二叉树的层序遍历&#xff0c;在前面的张篇blog我们初步实现了链式二叉树递归部分的内容&#xff0c;对于递归算法的学习和思维方式我们仍然需要不断加强&#xff0c;所以将对链式二叉树进行…

Python与ArcGIS系列(二十)GDAL之合并shp和geojson要素图层

目录 0 简述1 代码实现2 结果展示0 简述 Shp格式是GIS中非常重要的数据格式,主要在Arcgis中使用,但在进行很多基于网页的空间数据可视化时,通常只接受GeoJSON格式的数据,众所周知JSON是利用键值对+嵌套来表示数据的一种格式,以其轻量、易解析的优点,被广泛使用与各种领域…

Flink与Redis集成:自定义连接器实现维表创建与数据汇入

目录 一、问题引入 二、Redis创建维表 2.1 预期效果展示 2.2 设计要点

python爬虫学习之解析_BeautifulSoup

目录 一、bs4的基本使用 &#xff08;1&#xff09;导入 &#xff08;2&#xff09;创建对象 二、节点定位 1、根据标签名查找节点 2、基本函数使用 &#xff08;1&#xff09;find &#xff08;2&#xff09;find_all &#xff08;3&#xff09;select 三、节点信息 1、获取节…

微搭低代码从入门到精通03用户注册

文章目录 1 搭建数据源2 开发API3 搭建页面4 数据入库5 页面跳转总结 小程序开发中&#xff0c;如果定位是面向内部人员使用的应用&#xff0c;那么我们就需要仔细考虑用户鉴权的问题。首先需要提供用户注册的通道&#xff0c;让用户可以自主完成注册。其次要提供角色分配的功能…

力扣349两个数的交集

题目连接&#xff1a;349. 两个数组的交集 - 力扣&#xff08;LeetCode&#xff09; 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a; nums1 [1,2,2…

Android组件化中的Arouter学习

假设现在有两个业务组件登录和问答模块之间需要进行通信&#xff0c;可能会想到用反射的方式&#xff0c;是可以但是会影响性能&#xff0c;而写的代码比较多类名这些要记清楚。 路由可以看做表&#xff0c;每个map对应一张表 我们可以试着这么写&#xff0c;完成MainActivity跳…

Kerberos 安全认证

什么是Kerberos Kerberos是一种计算机网络授权协议&#xff0c;用来在非安全网络中&#xff0c;对个人通信以安全的手段进行身份认证。密码不在网络上传输&#xff0c;提高安全性。 简写名词 AS&#xff08;Authentication Server&#xff09; 认证服务器KDC&#xff08;Key…

线程的状态和生命周期

前言 在多线程编程中&#xff0c;线程的状态和生命周期是两个非常重要的概念。了解线程的状态和生命周期可以帮助我们更好地理解和编写多线程程序。在本篇博客中&#xff0c;我们将详细介绍线程的状态和生命周期&#xff0c;以及如何在不同的状态之间进行转换。 一、线程的状态…

汉化GAL笔记

Idol Magical Girl Chiru Chiru Michiru 1 2 发布地址&#xff1a;https://tieba.baidu.com/p/8881200756 .hg3文件格式搜索 .int封包 cs2conf.dll文件 确认catsystem2引擎 使用GARbro解包 lneditor解析cst文件失败 使用cstTextProc&#xff1a;初窥Galgame汉化——以Ca…

【原创】VMware创建子网,并使用软路由获得访问互联网的能力,并通过静态路由让上层网络访问位于虚拟机的子网

前言 一看标题就很离谱&#xff0c;确实内容也有点复杂&#xff0c;我的初衷是为后面搞软路由做准备&#xff0c;先通过VMware进行可行性验证&#xff0c;确定方案是否可行&#xff0c;再做下一步的计划。结论当然可以的&#xff0c;能通能访问&#xff0c;强的不行。 网络拓…

SV-7041T 多媒体教学广播IP网络有源音箱

SV-7041T是深圳锐科达电子有限公司的一款2.0声道壁挂式网络有源音箱&#xff0c;具有10/100M以太网接口&#xff0c;可将网络音源通过自带的功放和喇叭输出播放&#xff0c;可达到功率30W。同时它可以外接一个30W的无源副音箱&#xff0c;用在面积较大的场所。5寸进口全频低音喇…

蓝桥杯嵌入式第七届真题(完成) STM32G431

蓝桥杯嵌入式第七届真题(完成) STM32G431 题目 相关文件 main.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body**********************…

Leetcode 3022. Minimize OR of Remaining Elements Using Operations

Leetcode 3022. Minimize OR of Remaining Elements Using Operations 1. 解题思路2. 代码实现 题目链接&#xff1a;3022. Minimize OR of Remaining Elements Using Operations 1. 解题思路 这道题坦率地说其实不太想写这篇题解&#xff0c;因为其实自己根本没有搞定&…

React详解

介绍&#xff1a; React是一个用于构建用户界面的javaScript库&#xff0c;起源于facebook的内部项目&#xff0c;在13年f进行开源 17版本官网&#xff1a;React – A JavaScript library for building user interfaces 18版本官网&#xff1a;React 官方中文文档 特点&…

Origin 2022下载安装教程,操作简单,小白也能轻松搞定,附安装包,带软件使用教程

前言 Origin是一个科学绘图、数据分析软件&#xff0c;支持各种各样的2D/3D图形&#xff0c;包括统计&#xff0c;信号处理&#xff0c;曲线拟合以及峰值分析&#xff0c;Origin具有强大的数据导入功能和多样的图形输出格式。 准备工作 1、Win7及以上系统 2、提前准备好 Or…

2024西湖论剑misc方向wp

每年的misc都是最无聊坐牢的 数据安全-easy_tables import pandas as pd import hashlib from datetime import datetimeusers_df pd.read_csv(users.csv) permissions_df pd.read_csv(permissions.csv) tables_df pd.read_csv(tables.csv) actionlog_df pd.read_csv(acti…