📝前言说明:

  • 本专栏主要记录本人的贪心算法学习以及LeetCode刷题记录,按专题划分
  • 每题主要记录:(1)本人解法 + 本人屎山代码;(2)优质解法 + 优质代码;(3)精益求精,更好的解法和独特的思想(如果有的话);(4)贪心策略正确性的 “证明”
  • 文章中的理解仅为个人理解。如有错误,感谢纠错

🎬个人简介:努力学习ing
📋本专栏:C++刷题专栏
📋其他专栏:C语言入门基础,python入门基础,C++学习笔记,Linux
🎀CSDN主页 愚润泽

你可以点击下方链接,进行其他贪心算法题目的学习

点击链接开始学习
贪心day1贪心day2
贪心day3贪心day4
贪心day5贪心day6
贪心day7贪心day8
贪心day9贪心day10

也可以点击下面连接,学习其他算法

点击链接开始学习
优选专题动态规划
递归、搜索与回溯贪心算法

题单获取→ 【贪心算法】题单汇总

题目

  • 452. 用最少数量的箭引爆气球
    • 个人解
  • 397. 整数替换
    • 优质解
      • 递归 + 记忆化搜索
      • 贪心
  • 354. 俄罗斯套娃信封问题
    • 优质解
      • 解法一(动态规划)
      • 解法二(贪心)


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

题目链接:https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/description/
在这里插入图片描述

个人解

思路:

  • 和前面的题目差不多

屎山代码:

class Solution {
public:int findMinArrowShots(vector<vector<int>>& points) {// 同样是合并区间,如果有重叠部分,则只需要一支箭// 按照右端点排序,我们射箭的时候往气球的结束位置射更容易射中多个(贪心)int ans = 1, n = points.size(); // 第一个始终要一箭ranges::sort(points.begin(), points.end(), [&](vector<int>& p1, vector<int>& p2){return p1[1] < p2[1];});int left = points[0][0], right = points[0][1];for(int i = 1; i < n; i++){if(points[i][0] > right)  // 射前一个气球的时候不能射到后一个气球,要加箭{ans++;right = points[i][1];  // 更新下一只箭射的位置}}return ans;}
};

时间复杂度:O(nlogn)O(nlogn)O(nlogn)
空间复杂度:O(logn)O(logn)O(logn)


397. 整数替换

题目链接:https://leetcode.cn/problems/integer-replacement/description/
在这里插入图片描述


优质解

递归 + 记忆化搜索

代码:

class Solution {
private:unordered_map<long long, int> memo;int dfs(long long n) {  // 用long long避免溢出if (n == 1) return 0;if (memo.count(n)) return memo[n];int steps;if (n % 2 == 0) {steps = 1 + dfs(n / 2);} else {// 对于奇数,分别处理n-1和n+1的情况steps = 1 + min(dfs(n - 1), dfs(n + 1));}memo[n] = steps;return steps;}public:int integerReplacement(int n) {return dfs((long long)n);  // 转换为long long再处理}
};

时间复杂度:O(logn)O(logn)O(logn)
空间复杂度:O(logn)O(logn)O(logn)

贪心

  • 我们把每个数写成二进制的方式进行分析,同时/操作,变成二进制右移一位
  • 然后通过找局部最优解,发现"贪”的方法
    在这里插入图片描述
    代码:
class Solution {
public:int integerReplacement(long long n) {int ans = 0;while(n != 1){if (n % 2 == 0)n /= 2;else{if(n == 3 || (n & 3) == 1)n -= 1;elsen += 1;}ans++;}return ans;}
};

354. 俄罗斯套娃信封问题

题目链接:https://leetcode.cn/problems/russian-doll-envelopes/description/
在这里插入图片描述


优质解

解法一(动态规划)

思路:

  • 按左端点排序,此时只需要关注右端点
  • 因为要套娃 → 变成求最长递增子序列问题(按右端点)

代码:

class Solution {
public:int maxEnvelopes(vector<vector<int>>& env) {int n = env.size();ranges::sort(env);vector<int> dp(n, 1);int ans = 1;for(int i = 1; i < n; i++){for(int j = 0; j < i; j++){if(env[j][1] < env[i][1] && env[j][0] < env[i][0]) // 因为会出现相同的左端点dp[i] = max(dp[j] + 1, dp[i]);}ans = max(ans, dp[i]);}return ans;}
};

时间复杂度:O(n2)O(n^2)O(n2),会超时

解法二(贪心)

  • 解法:重写排序 + 贪心 + 二分
    因为本题需要考虑两个端点,所以需要重写排序(减少贪心时的分类讨论)
  • 排序:左端点从小到大排,左端点相同时,右端点从大到小的顺序排 → 变成完全的最长递增子序列
  • 然后用贪心 + 二分的方式解决问题

代码:

class Solution {
public:int maxEnvelopes(vector<vector<int>>& env) {int n = env.size();sort(env.begin(), env.end(), [&](vector<int> &a, vector<int> &b){return a[0] != b[0] ? a[0] < b[0] : a[1] > b[1];});vector<int> ret; // 存储最长子序列ret.push_back(env[0][1]);for(int i = 1; i < n; i++){int b = env[i][1];if(b > ret.back()) ret.push_back(b);else{int left = 0, right = ret.size() - 1;while(left < right){// 找到第一个 > b 的数int mid = (left + right) >> 1;if(ret[mid] < b) left = mid + 1; // <=b 可以全部排除else right = mid;}ret[left] = b;}}return ret.size();}
};

时间复杂度:O(nlogn)O(nlogn)O(nlogn)


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

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

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

相关文章

linux C 语言开发 (八) 进程基础

文章的目的为了记录使用C语言进行linux 开发学习的经历。开发流程和要点有些记忆模糊&#xff0c;赶紧记录&#xff0c;防止忘记。 相关链接&#xff1a; linux C 语言开发 (一) Window下用gcc编译和gdb调试 linux C 语言开发 (二) VsCode远程开发 linux linux C 语言开发 (…

从零学算法1094

1094.拼车 车上最初有 capacity 个空座位。车 只能 向一个方向行驶&#xff08;也就是说&#xff0c;不允许掉头或改变方向&#xff09; 给定整数 capacity 和一个数组 trips , trips[i] [numPassengersi, fromi, toi] 表示第 i 次旅行有 numPassengersi 乘客&#xff0c;接他…

B2B企业营销型AI Agent服务商推荐:谁更专业?如何选型?

一、引言&#xff1a;为什么B2B企业需要营销型AI Agent&#xff1f;在当前竞争激烈的B2B市场中&#xff0c;企业普遍面临几大挑战&#xff1a;线索获取难&#xff1a;获客成本持续上升&#xff0c;高质量线索难以筛选。销售周期长&#xff1a;从初步接触到签单&#xff0c;往往…

算法-双指针5.6

目录 &#x1f33f;力扣611-有效三角形得个数 &#x1f9ca;题目链接&#xff1a;https://leetcode.cn/problems/valid-triangle-number/description/ &#x1f9ca;题目描述&#xff1a;​编辑 &#x1f9ca;解题思路&#xff1a; &#x1f9ca;解题代码&#xff1a; &a…

超参数自动化调优指南:Optuna vs. Ray Tune 对比评测

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;注册即送-H卡级别算力&#xff0c;80G大显存&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生更享专属优惠。 引言&#xff1a;从"手动炼丹"到"自动化…

软考-局域网基础考点总结

这篇文章用于整理软考网络相关的知识点&#xff0c;囊括了详细的局域网基础的考点&#xff0c;能够让你认真备考&#xff0c;基础知识一网打尽&#xff0c;让后续的学习更加通畅~ 第一部分&#xff1a;OSI七层参考模型 OSI(Open System Interconnection)模型是一个理论框架&am…

Node.js核心模块介绍

1. fs 模块fs&#xff08;File System&#xff09;模块允许对文件系统进行操作&#xff0c;提供了文件读写、文件夹操作等功能。fs 支持同步和异步两种 API。1.1. 常用方法读取文件&#xff1a;异步: fs.readFile()同步: fs.readFileSync()写入文件&#xff1a;异步: fs.writeF…

缓存三大劫攻防战:穿透、击穿、雪崩的Java实战防御体系(二)

第二部分&#xff1a;缓存击穿——热点key过期引发的“DB瞬间高压” 缓存击穿的本质是“某个热点key&#xff08;高并发访问&#xff09;突然过期”&#xff0c;导致大量请求在同一时间穿透缓存&#xff0c;集中冲击DB&#xff0c;形成“瞬间高压”。 案例3&#xff1a;电商秒杀…

Linux相关概念和易错知识点(45)(网络层、网段划分)

目录1.网络层&#xff08;1&#xff09;IP协议头格式&#xff08;2&#xff09;工作流程2.网段划分&#xff08;1&#xff09;五类地址&#xff08;2&#xff09;回环地址&#xff08;3&#xff09;网段的特殊地址&#xff08;4&#xff09;网络建设我们前面暂时跳过了网络层&a…

transition(过渡)和animation(动画)——CSS

1.transition过渡可以为一个元素在不同状态之间进行切换时添加过渡效果&#xff0c;实现不同状态间的变化效果。通过触发事件(鼠标悬停、点击等)&#xff0c;在两个状态间切换。1.1 使用语法&#xff1a;transition: [property] [duration] [timing-function] [delay];property…

Spring Cloud项目国产化改造MySQL迁移达梦数据库,SQL变更

达梦数据库下载地址&#xff1a;https://eco.dameng.com/download 达梦数据库安装文档&#xff1a;https://eco.dameng.com/document/dm/zh-cn/start/dm-install-linux.html 数据迁移SQLark工具使用 首先&#xff0c;本次MySQL迁移使用了SQLark工具 1.下载安装SQLark https…

Cesium---1.133版本不修改源码支持arcgis MapServer 4490切片

参照了这篇博文&#xff1a;https://blog.csdn.net/qq_19689967/article/details/121449888https://blog.csdn.net/qq_19689967/article/details/121449888 利用新版本的源码进行了修改&#xff0c;可以实现服务加载&#xff1a; Event.js import { Check,defined} from &qu…

迭代器和生成器的区别与联系

目录 1.可迭代对象 (Iterable) 2.迭代器 (Iterator) 3.生成器 (Generator) 3.1生成器函数 vs 生成器表达式 4.三者之间的联系与区别 5.关系图&#xff08;帮助你一眼看懂&#xff09; 6.核心结论&#xff08;记住这三句话&#xff09; 1.可迭代对象 (Iterable) 定义&…

Dropout:深度学习中的随机丢弃正则化技术

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 1 什么是Dropout&#xff1f; Dropout是深度学习中最广泛使用的正则化…

vue2迁移到vite[保姆级教程]

vue2迁移到vite[保姆级教程]使用vue CLI创建项目进行vite迁移详细步骤1. 安装 Vite 和 Vue 2 支持插件2. 创建 vite.config.js3. 修改 package.json 脚本4. 创建 index.html5. 确保 main.js 正确引入6. 处理静态资源7. 构建优化&#xff08;可选&#xff09;8. 启动项目常见问题…

浏览器输入URL回车

一&#xff0c;URL解析浏览器会对输入的 URL&#xff08;统一资源定位符&#xff09; 进行拆解&#xff0c;搞清楚 “目标是谁、要获取什么资源https://www.baidu.com/s?wdCDN 拆解后&#xff1a;协议&#xff08;Scheme&#xff09;&#xff1a;https&#xff08;加密通信协议…

leedcode 算法刷题第三十四天

198. 打家劫舍 class Solution { public:int rob(vector<int>& nums) {if(nums.size()0){return 0;}else if(nums.size()1){return nums[0];}else if(nums.size()2){return max(nums[0],nums[1]);}vector<int> dp(nums.size()1,0);dp[0] nums[0];dp[1] nums…

计算机网络(二)物理层数据链路层

&#xff08;物理层、数据链路层... 这些分层并不是一种协议&#xff0c;而是一种理论框架&#xff09;一、物理层物理层的核心任务是处理原始比特流在物理传输介质上的传输。 主要任务物理层的主要任务可以概括为以下几点&#xff0c;它们是确保数据能在网络硬件间可靠传输的基…

android13修改WiFi扫描二维码识别识别成功率不高的问题

Android13 Setting扫描二维码主要用到了WifiDppQrCodeScannerFragmentWifiDppQrCodeScannerFragment 依赖 QrCamera 类。QrCamera 使用了 Camera1 的API。开发了新类 ModernQrScanner &#xff0c;采用了Camera2和更新了最新的Zxing包。添加一个新的二维码扫描的处理类&#…

AI赋能与敏捷融合:未来电源项目管理者的角色重塑与技能升级——从华为实战看高技术研发项目的管理变革

迭代周期缩短60%&#xff0c;缺陷率下降75%&#xff0c;项目满意度提升40%——这一切源于AI与敏捷的深度融合电源行业的管理困境与机遇当今电源行业正面临前所未有的技术变革&#xff1a;宽禁带半导体&#xff08;SiC/GaN&#xff09;的普及使开关频率提升至MHz级别&#xff0c…