【贪心算法】day9

【贪心算法】day9

📝前言说明:

  • 本专栏主要记录本人的贪心算法学习以及LeetCode刷题记录,按专题划分
  • 每题主要记录:(1)本人解法 + 本人屎山代码;(2)优质解法 + 优质代码;(3)精益求精,更好的解法和独特的思想(如果有的话);(4)贪心策略正确性的 “证明”
  • 文章中的理解仅为个人理解。如有错误,感谢纠错
🎬个人简介:努力学习ing
📋本专栏:C++刷题专栏
📋其他专栏:C语言入门基础python入门基础C++学习笔记Linux
🎀ZEEKLOG主页 愚润泽

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

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

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

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

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

题目


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

题目链接:https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/description/

在这里插入图片描述

个人解

思路:

  • 和前面的题目差不多

屎山代码:

classSolution{public:intfindMinArrowShots(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 ( n l o g n ) O(nlogn) O(nlogn)
空间复杂度: O ( l o g n ) O(logn) O(logn)


397. 整数替换

题目链接:https://leetcode.cn/problems/integer-replacement/description/

在这里插入图片描述

优质解

递归 + 记忆化搜索

代码:

classSolution{private: unordered_map<longlong,int> memo;intdfs(longlong n){// 用long long避免溢出if(n ==1)return0;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:intintegerReplacement(int n){returndfs((longlong)n);// 转换为long long再处理}};

时间复杂度: O ( l o g n ) O(logn) O(logn)
空间复杂度: O ( l o g n ) O(logn) O(logn)

贪心

  • 我们把每个数写成二进制的方式进行分析,同时/操作,变成二进制右移一位

然后通过找局部最优解,发现"贪”的方法

在这里插入图片描述


代码:

classSolution{public:intintegerReplacement(longlong n){int ans =0;while(n !=1){if(n %2==0) n /=2;else{if(n ==3||(n &3)==1) n -=1;else n +=1;} ans++;}return ans;}};

354. 俄罗斯套娃信封问题

题目链接:https://leetcode.cn/problems/russian-doll-envelopes/description/

在这里插入图片描述

优质解

解法一(动态规划)

思路:

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

代码:

classSolution{public:intmaxEnvelopes(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 ( n 2 ) O(n^2) O(n2),会超时

解法二(贪心)

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

代码:

classSolution{public:intmaxEnvelopes(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 ( n l o g n ) O(nlogn) O(nlogn)


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

Read more

AWS Kiro 账号池管理系统 | 将 Amazon Q Developer API 转换为 OpenAI 兼容格式 | 支持多账号池、OIDC 自动认证、令牌自动刷新、Web 管理控制台 | Go

AWS Kiro 账号池管理系统 | 将 Amazon Q Developer API 转换为 OpenAI 兼容格式 | 支持多账号池、OIDC 自动认证、令牌自动刷新、Web 管理控制台 | Go

Claude API - AWS Kiro 账号池管理 | OpenAI 兼容代理服务 项目地址在wget 里面 web页面访问把后缀.git删掉即可 效果图 AWS Kiro 账号池管理系统 - 将 Amazon Q Developer (Kiro) API 转换为 OpenAI 兼容格式的企业级 Go 代理服务。支持多账号池管理、OIDC 自动认证、令牌自动刷新、流式响应、完整的 Web 管理控制台。 关键词: AWS Kiro, Amazon Q Developer, Claude API, OpenAI Proxy, 账号池管理, OIDC 认证, Go

By Ne0inhk
Java Web 开发环境搭建:IDEA+Tomcat 安装与部署超详细教程

Java Web 开发环境搭建:IDEA+Tomcat 安装与部署超详细教程

在 Java Web 开发中,IDEA 作为主流的集成开发工具,搭配 Tomcat 轻量级 Web 服务器是入门首选。本文将基于 Java Web 基础开发要求,从 JDK 环境配置、Tomcat 安装配置、IDEA 安装、Web 项目创建,到 Tomcat 在 IDEA 中的部署运行,进行一步一图式详细讲解,零基础也能轻松上手。 一、前置准备:JDK 环境配置 Java Web 开发的核心基础是 JDK,Tomcat 和 IDEA 的运行都依赖 JDK 环境,需先完成 JDK 的安装与环境变量配置。 1. 下载与安装

By Ne0inhk
Flutter 组件 ews 的适配 鸿蒙Harmony 实战 - 驾驭企业级 Exchange Web Services 协议、实现鸿蒙端政企办公同步与高安通讯隔离方案

Flutter 组件 ews 的适配 鸿蒙Harmony 实战 - 驾驭企业级 Exchange Web Services 协议、实现鸿蒙端政企办公同步与高安通讯隔离方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 ews 的适配 鸿蒙Harmony 实战 - 驾驭企业级 Exchange Web Services 协议、实现鸿蒙端政企办公同步与高安通讯隔离方案 前言 在鸿蒙(OpenHarmony)生态进军政企办公领域的过程中,与现有企业信息化基础设施的深度集成是一道必答题。即便是在全连接、分布式的今天,微软的 Exchange 服务器依然是全球无数大厂与政务系统处理邮件、日历同步的核心底座。 对于习惯了简单 http.get 的移动开发者来说,Exchange Web Services(EWS)协议由于其复杂的 SOAP 封装、繁琐的 XML 数据结构以及极其严苛的身份认证机制,往往是一块难啃的“骨头”。 ews 库为 Dart 提供了成熟的、类型安全的

By Ne0inhk
本地服务器用 OpenClaw + Open WebUI 搭建企业多部门 AI 平台(附 Docker 避坑指南)

本地服务器用 OpenClaw + Open WebUI 搭建企业多部门 AI 平台(附 Docker 避坑指南)

引言: 最近在尝试使用 OpenClaw,发现这个 AI 个人助理框架非常有意思。于是团队里就有人提出:能不能为公司的多个部门,分别搭建专属的 OpenClaw 服务器? 诚然,现在有钉钉、飞书等成熟的办公软件可以接入 AI,但对于一些尚未全面普及此类协作软件的企业(或者需要绝对私有化部署的团队)来说,独立搭建一套内部 AI 门户依然是刚需。 起初,我们考虑直接让大家通过 OpenClaw 自带的 Web 界面进行跨电脑访问。但实操后发现这存在致命缺陷: 1. 权限越界:自带的 Web 端拥有底层的配置编辑权限,暴露给普通员工极其不安全。 2. 无法溯源:多终端共用一个 Web 界面,根本无法追溯对话是由谁发起的。 3. 缺乏隔离:无法按部门精细化分配 API 额度或限制特定部门只能访问特定的 OpenClaw 节点,无法实现业务隔离。 为了解决这些痛点,我们最终确定了这套架构方案:

By Ne0inhk