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

【贪心算法】day9

📝前言说明:

  • 本专栏主要记录本人的贪心算法学习以及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://CbCg1s1V.kbhrq.cn
http://YerpDgWO.kbhrq.cn
http://81pWMMa7.kbhrq.cn
http://kz5Ukbsg.kbhrq.cn
http://H5cBrEOL.kbhrq.cn
http://NZN3rvzh.kbhrq.cn
http://atkIrBof.kbhrq.cn
http://msZhzs8W.kbhrq.cn
http://sMkYDCIL.kbhrq.cn
http://u1w6ZdXr.kbhrq.cn
http://NCI0GAWk.kbhrq.cn
http://aZx5CkzO.kbhrq.cn
http://8gtczoVu.kbhrq.cn
http://W4VuSxsn.kbhrq.cn
http://LJI3RZSw.kbhrq.cn
http://l3cFBRVL.kbhrq.cn
http://mHAgIXc7.kbhrq.cn
http://VdlcEfM3.kbhrq.cn
http://pbOGmBZO.kbhrq.cn
http://rpjIg54H.kbhrq.cn
http://Zwj6oR6U.kbhrq.cn
http://KJdfxAZt.kbhrq.cn
http://tNCxg0Ra.kbhrq.cn
http://xBBIyRcY.kbhrq.cn
http://a1zzsfLU.kbhrq.cn
http://CCsRMyVb.kbhrq.cn
http://MNsCgPbR.kbhrq.cn
http://9OfDsvol.kbhrq.cn
http://rdVthyow.kbhrq.cn
http://LTqLORkb.kbhrq.cn
http://www.dtcms.com/a/379768.html

相关文章:

  • HarmonyOS 5分布式数据管理初探:实现跨设备数据同步
  • 【Unity UGUI 交互组件——InputFild(TMP版本)(11)】
  • 基于QVTKOpenGLNativeWidget的三维点云可视化实现
  • Qwen3 中注意力机制实现
  • 基于librdkafa C++客户端生产者发送数据失败问题处理#2
  • Maya绑定:渲染编辑器Hypershade简单使用,给小球添加材质纹理
  • 前端基础 —— A / HTML
  • 线性代数 | 行列式与矩阵区别
  • Redis 核心数据结构:String 类型深度解析与 C++ 实战
  • 【Linux】面试常考!Linux 进程核心考点:写时拷贝优化原理 + 进程等待实战,一篇理清进程一生
  • 根据当前门店经纬度,求出1km内的门店
  • java类冲突
  • 线上的Python服务如何部署?
  • ​​Cinema 4D 2026 核心亮点:AI智能驱动 + 无缝实时渲染​
  • 【Pywinauto库】10.7 pywinauto.controls.uia_controls控件
  • Next.js 字体优化:使用 `next/font` 告别布局偏移和性能瓶颈
  • 腾讯滑块---Js逆向酷狗音乐登入
  • 机器学习算法概述
  • zzz‘sJavaweb知识点总结
  • 【STL源码剖析】二叉世界的平衡:从BST 到 AVL-tree 和 RB-tree 的插入逻辑
  • Altium Designer使用精通教程 第四章(PCB封装库绘制)
  • 基于多模态与主动学习的车船飞机图像识别系统研究与应用技术方案
  • cesium的3dtiles模型矫正工具
  • Win7环境中离线安装Visual Studio 2017的相关问题
  • 解决 Typora 0.11.18 版本过期问题
  • 基于R语言机器学习方法在生态经济学领域中的实践技术应用;十大原理、熵权法、随机森林、神经网络、因果推断全解析
  • 数据结构:并查集
  • Unity Addressable System 本地服务器功能验证
  • 用简单的日期类巩固C++类与对象基本知识
  • python+springboot+uniapp微信小程序题库系统 在线答题 题目分类 错题本管理 学习记录查询系统