当前位置: 首页 > news >正文

代码随想录算法训练营day30 | 452. 用最少数量的箭引爆气球 、435. 无重叠区间、763.划分字母区间

碎碎念:加油
参考:代码随想录

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

题目链接

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

思想

局部最优: 让重叠的气球尽量在一起,用一支弓箭射。
全局最优: 用最少数量的箭引爆气球。
首先对气球进行排序,可以按照左边界排序,这样可能会重叠的气球排在一起。
如何判断气球重叠 ,因为左边界已经排序了,所以判断看右边界即可。如果第i个气球的左边界小于等于前一个气球的右边界,说明两个气球重叠了。
此时我们想看这两个气球和下一个气球是否重叠 ,就需要更新右边界,更新为两个气球右边界的最小值。更新右边界,用来和下一个气球比较。

题解

// cpp
class Solution {
public:static bool cmp(const vector<int>& a, const vector<int>& b) {return a[0] < b[0];}int findMinArrowShots(vector<vector<int>>& points) {if (points.size() == 0) return 0;sort(points.begin(), points.end(), cmp);int result = 1;for (int i = 1; i < points.size(); i++) {if (points[i][0] > points[i - 1][1]) {result++;} else {points[i][1] = min(points[i][0], points[i - 1][0]);}}return result;}
};
# python
class Solution:def findMinArrowShots(self, points: List[List[int]]) -> int:if len(points) == 0:return 0points.sort(key=lambda x:x[0])result = 1for i in range(1, len(points)):if points[i][0] > points[i - 1][1]:result += 1else:points[i][1] = min(points[i][1], points[i - 1][1])return result

反思

result从1开始,因为显然使得所有气球都爆炸的箭的数量最少为1。

435. 无重叠区间

题目链接

435. 无重叠区间

思想

本题的思想和上一题很相似。
首先排序,让相邻的区间尽可能挨在一起。本做法用的是按照左边界排序。
判断相邻区间是否重叠: 如果当前遍历到的区间的左边界小于上一个区间的右边界,那么它们就是重叠的,result加一,更新右边界的大小,更新为两个区间右边界中较小的那个。

题解

// cpp
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() == 0) return 0;sort (intervals.begin(), intervals.end(),cmp);int result = 0;for (int i = 1; i < intervals.size(); i++) {if (intervals[i][0] < intervals[i - 1][1]) {result++;intervals[i][1] = min(intervals[i][1], intervals[i - 1][1]);}}return result;}
};
# python
class Solution:def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:if len(intervals) == 0:return 0intervals.sort(key=lambda x:x[0])result = 0for i in range(1, len(intervals)):if intervals[i][0] < intervals[i - 1][1]:result += 1intervals[i][1] = min(intervals[i][1], intervals[i - 1][1])return result

反思

763.划分字母区间

题目链接

763.划分字母区间

思想

遍历字符串,统计每个字符出现的最远位置。
遍历字符串,更新字符的最远出现下标,如果找到字符的最远出现位置下标和当前的下标相等了,就找到了分割点。请添加图片描述

题解

// cpp
class Solution {
public:vector<int> partitionLabels(string s) {int hash[27] = {0};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;}
};
# python
class Solution:def partitionLabels(self, s: str) -> List[int]:hash_ = {}for i, ch in enumerate(s):hash_[ch] = iresult = []left = 0right = 0for i, ch in enumerate(s):right = max(right, hash_[ch])if i == right:result.append(right - left + 1)left = i + 1return result

反思

http://www.lryc.cn/news/412429.html

相关文章:

  • 如何手动修复DLL丢失?2种手动修复dll文件方法
  • Node.js(2)——压缩前端html
  • 堆的实现-向上调整算法-向下调整算法-堆排序-TopK问题 C语言
  • 【C++BFS】1466. 重新规划路线
  • 服务器并发模型
  • Chapter 23 数据可视化——地图
  • Linux笔记 --- 组合数据类型
  • DaoCloud-Dockfile文件NGINX文件
  • 耳机行业中MIC ENC
  • python-自动化办公-Excel-Openpyxl
  • 图形编辑器基于Paper.js教程10:导入导出svg,导入导出json数据
  • [STM32][Bootloader][教程]STM32 HAL库 Bootloader开发和测试教程
  • 如何手写一个SpringBoot框架
  • vite解决前端跨域步骤
  • 同步交互与异步交互:深入解析与选择
  • Day1
  • Introduction to Data Analysis with PySpark
  • 基于双PI控制器结构的六步逆变器供电无刷直流电机调速simulink仿真
  • 双向链表的基本操作
  • modbus tcp和modbusRTU的区别是什么?
  • web小游戏开发:拼图(四)对调和移动拼图玩法的实现
  • 前端:Vue学习 - 智慧商城项目
  • KVM调整虚拟机与CPU铆钉(绑定)关系
  • 华火电焰灶:烹饪新宠,温暖与美味的完美融合
  • 理想发周榜,不是新能源市场的原罪
  • AHK是让任何软件都支持 Shift + 鼠标滚轮 实现界面水平滚动
  • 如何在C语言中实现求解超级丑数
  • secExample靶场之java反序列化漏洞复现
  • 解决升级Linux内核后,open files设置无效的问题。
  • 关于防范勒索病毒Play新变种的风险提示