C++刷题 - 7.27

贪心算法的详细逻辑

这个问题的最优解可以用 贪心算法 在 O(N) 时间 内解决。它的核心思想是:

每次操作尽可能覆盖最长的连续非零区间,并通过数学分析发现:最小操作次数等于所有“上升台阶”的高度差之和


1. 直观理解

假设 steps = [1, 2, 3, 2, 1],我们可以这样操作:

  1. 第一次操作:覆盖整个数组 [1,2,3,2,1] → [0,1,2,1,0]
    (操作次数 +=1)

  2. 第二次操作:覆盖 [1,2,1] → [0,0,1,0,0]
    (操作次数 +=1)

  3. 第三次操作:覆盖 [1] → [0,0,0,0,0]
    (操作次数 +=1)

总操作次数 = 3,正好等于 1 (初始) + (2-1) + (3-2) = 3


2. 贪心策略的数学证明

  • 关键观察

    • 如果当前数字 steps[i] 比前一个数字 steps[i-1] 大,说明需要 新增 steps[i] - steps[i-1] 次操作

    • 如果 steps[i] <= steps[i-1],说明它可以被之前的操作覆盖,无需新增操作次数。

  • 数学表达

    text

    总操作次数 = steps[0] + Σ max(steps[i] - steps[i-1], 0)  (i = 1 to N-1)

3. 代码实现

cpp

#include <vector>
#include <iostream>
using namespace std;int GetMinStep(const vector<int>& steps) {if (steps.empty()) return 0;int res = steps[0]; // 初始必须有 steps[0] 次操作for (int i = 1; i < steps.size(); i++) {if (steps[i] > steps[i-1]) {res += steps[i] - steps[i-1]; // 增加新的操作}}return res;
}int main() {vector<int> steps1 = {1, 2, 3, 2, 1};cout << GetMinStep(steps1) << endl; // 输出 3vector<int> steps2 = {3, 2, 1, 2, 3};cout << GetMinStep(steps2) << endl; // 输出 5vector<int> steps3 = {4, 1, 2, 3, 1};cout << GetMinStep(steps3) << endl; // 输出 6 (4 + 0 + 1 + 1 + 0)return 0;
}

4. 为什么贪心算法是正确的?

反证法

假设贪心算法不是最优的,那么存在某个 steps[i] 没有被正确覆盖:

  • 情况 1steps[i] > steps[i-1]
    如果少操作,会导致 steps[i] 无法归零,矛盾。

  • 情况 2steps[i] <= steps[i-1]
    它已经被之前的操作覆盖,无需额外操作。

因此,贪心策略的正确性得证。


5. 对比原始模拟方法

方法时间复杂度适用场景
原始模拟(每次找最长区间减1)O(N²)直观但较慢
贪心算法(数学优化)O(N)最优解

6. 实际应用示例

示例 1steps = [3, 2, 1, 2, 3]
  • 计算过程

    • res = 3(初始)

    • i=12 <= 3 → 不增加

    • i=21 <= 2 → 不增加

    • i=32 > 1 → res += 1 → res=4

    • i=43 > 2 → res += 1 → res=5

  • 总操作次数 = 5

示例 2steps = [4, 1, 2, 3, 1]
  • 计算过程

    • res = 4(初始)

    • i=11 <= 4 → 不增加

    • i=22 > 1 → res += 1 → res=5

    • i=33 > 2 → res += 1 → res=6

    • i=41 <= 3 → 不增加

  • 总操作次数 = 6


7. 总结

  • 贪心策略:利用高度差直接计算最小操作次数。

  • 优势:O(N) 时间,无需模拟每次操作。

  • 适用场景:题目允许数学分析时,优先使用贪心算法。

这种方法高效且优雅,能完美解决问题! 🎯


资源 

#include <iostream>
#include <vector>
#include <climits>
#include <queue>
#include <list>
#include <unordered_set>
using namespace std;
void PrintList(list<pair<int,int>> lists)
{for(auto l:lists){cout<<"<"<<l.first<<" "<<l.second<<">"<<"   ";}cout<<endl;
}int Solution(const int frameNum, const int windowSize, const vector<int> pages) 
{int ret = 0;// 记录访问次数,访问时间,// <51 1> <52 1> <53 1>// <52 1> <53 1> <54 1>// 要么遍历一遍时间,要么遍历一遍page,要么加空间// 链表比较合适,list<pair<int,int>> pagesList;for(auto& page:pages){auto it = pagesList.begin();bool flagFind = false;while(it!=pagesList.end()){if(it->first == page){flagFind = true;it->second++;break;}it++;}if(flagFind == false){if(pagesList.size()<frameNum){pagesList.push_back(make_pair(page,1));}else // 触发置换{//从头节点开始取windowSize个//遍历得到最小值auto left = pagesList.begin();int nums = windowSize;int minof = INT_MAX;while (nums>0){minof = min(minof,left->second);left++;nums--;}nums = windowSize;left = pagesList.begin();while (nums>0){if(left->second==minof){pagesList.erase(left);pagesList.push_back(make_pair(page,1));break;}left++;nums--;}ret++;}}//PrintList(pagesList);//cout<<ret<<endl;}return ret;
}

单词统计

int Solution(const vector<string> lines) 
{// 需要特殊处理的 " " . ,    -string allLines;int ret = 0;for(int l=0;l<lines.size();l++){int i =0;if(lines[l] == "-"){  }    else{  while (i<lines[l].size()){while(i<lines[l].size()&&(lines[l][i]==','||lines[l][i]=='.'||lines[l][i]==' ')){i++;}if(i<lines[l].size()){ret++;while((i<lines[l].size())&&(lines[l][i]<='z'&&lines[l][i]>='a')){i++;} }if((i==lines[l].size()-1 )&& lines[l][i]=='-') {i++;if(l+1<lines.size()&&lines[l+1][0]>='a'&&lines[l+1][0]<='z')   { ret--;}if(l+1<lines.size()&&lines[l+1]=="-"){ret--;}}}}}return ret;
}

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

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

相关文章

音频3A处理简介之AGC(自动增益控制)

在音频通话和视频会议中&#xff0c;音频自动增益控制AGC模块的主要作用&#xff1a;• 稳定音频信号的输出电平。无论麦克风采集信号的强弱&#xff08;如用户离麦克风远近程度不同&#xff09;&#xff0c;尽可能保证音频采集模块的输出音量保持相对一致&#xff0c;不会偏大…

web前端打包apk包

我用的是HBuilder工具,可视化更便捷&#xff0c;目前我这操作的apk包是不需要上架的&#xff0c;所以跟实际需要上架的可能还有些出入 首先先新建个项目&#xff0c;选择5App模式 把目前需要打包的内容上传到服务器&#xff0c;我们以嵌套的形式进行打包&#xff0c;找到index.…

Ansible提权sudo后执行报错

1.问题 配置了sudo提权信息后&#xff0c;执行ansible-play报错&#xff0c;报错信息如下&#xff1a;2.原因 sudo没有执行**/bin/sh的权限&#xff0c;而ansible脚本中依赖/bin/sh**&#xff0c;所以报错了&#xff1a; 查看日志sudo tail -f /var/log/secure3.解决方式 修改*…

.NET报表控件ActiveReports发布v19.0——正式兼容 .NET 9

ActiveReports 是一款专注于 .NET 和 .NET Core 平台的报表控件。通过拖拽式报表设计器&#xff0c;可以快速地设计 Excel表格、Word文档、图表、数据过滤、数据钻取、精准套打等类型报表&#xff0c;全面满足 WinForm、ASP.NET、ASP.NET MVC、WPF 平台中各种报表的开发需要。同…

SCI论文选词炼句

标准句子不能啰嗦&#xff1b;词不能有问题&#xff0c;得是SCI中经常出现的&#xff0c;符合上下文的。SCI论文中常出现的摸棱两可的词单词涵义例子Architecture指 整体系统设计方案&#xff0c;如网络层次结构、模块组合、激活函数选择等深度学习模型架构Structure更泛泛&…

Qt deleteLater 延迟删除原理

deleteLater 调用 事件发送 void QObject::deleteLater() {QCoreApplication::postEvent(this, new QDeferredDeleteEvent()); }首先该对象继承QObject调用deleteLater&#xff0c; 内部会发送删除事件QCoreApplication::postEvent(this, new QDeferredDeleteEvent()) 到事件循…

TypeScript SDK 升级:通过 Upload Relay 赋能更多应用

自 3 月主网上线以来&#xff0c;Walrus 开发者社区持续展现出强劲的发展势头&#xff1a; 当前 Walrus 已存储超 758 TB 数据&#xff0c;为数百个项目提供支持。在 2025 年 6 月举办的 Sui Overflow 黑客松上&#xff0c;Walrus 成为最受欢迎的数据层。该赛事共收到 599 个项…

C#线程同步(二)锁

目录 1.lock 2.Monitor 3.锁的其它要注意的问题 3.1同步对象的选择 3.2什么时候该上锁 3.3锁和原子性 3.4嵌套锁 3.5 死锁 3.6 性能 4.Mutex 5.Semaphore 1.lock 让我们先看一段代码&#xff1a; class ThreadUnsafe {static int _val1 1, _val2 1;static void G…

鸿蒙智能居家养老系统构思(续二)—— 适老化烹饪中心详细构思

一、背景在“写给华为鸿蒙智家 —— 智能居家养老系统构思”一文中&#xff0c;结合对居家养老的理解及个人体验&#xff0c;提出了基于鸿蒙OS实现居家养老系统的粗略构思。其中包含“吃得好”。当老人到了不能随性外出活动、只能在家消耗时光时&#xff0c;除了一些看看电视、…

高斯透镜公式(调整镜头与感光元件之间的距离时,使得不同距离的物体在感光元件上形成清晰的影像)

当使用定焦镜头时&#xff0c;仍然可以调整镜头与感光元件&#xff08;或胶片&#xff09;之间的距离时&#xff0c;使得不同距离的物体在感光元件上形成清晰的影像。对此可以用高斯透镜公式进行解释&#xff1a; 一、透镜成像的基本原理 在光学中&#xff0c;一个基本的公式是…

预过滤环境光贴图制作教程:第三阶段 - GGX 分布预过滤

核心目标 GGX 分布是 PBR 中模拟粗糙表面高光反射的主流模型,其核心是通过统计分布描述微表面的朝向概率。本阶段的目标是: 基于第一阶段生成的环境图集,预计算 6 个级别的 GGX 过滤结果(对应不同粗糙度); 使用蒙特卡洛采样(Monte Carlo Sampling)加速 GGX 卷积计算;…

Spring框架与AutoCAD结合应用

什么是AutoCAD? AutoCAD简介 AutoCAD是由美国Autodesk公司开发的计算机辅助设计(CAD)软件,广泛应用于建筑、工程、制造、产品设计等领域。它支持2D绘图和3D建模,提供精确的图形工具和自动化功能,帮助用户高效创建技术图纸和模型。 主要功能 2D绘图:提供直线、圆弧、多…

Java 学习笔记:常用类、String 与日期时间处理

作为一名名 Java 初学者&#xff0c;最近在学习过程中整理了一些关于常用类、String 类以及日期时间处理的知识点。这些内容是 Java 基础中的重点&#xff0c;也是日常编程练习中频繁用到的工具&#xff0c;掌握它们能让我们在写代码时更加得心应手。今天把这些笔记分享出来&am…

Android常用的adb和logcat命令

ADB ADB&#xff0c;即 Android Debug Bridge 是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具&#xff0c;它可为各种设备操作提供便利&#xff0c;如安装和调试应用&#xff0c;并提供对 Unix shell&#xff08;可用来在模拟器或连接的设备上运行各种命令&…

重学JS-001 --- JavaScript算法与数据结构(一)JavaScript 基础知识

文章目录 变量 变量命名规则 变量命名 let vs const 变量使用范围 赋值 = 控制台输出 运算符 ++ -- == === !== 注释 转义字符 数据类型 7种 原始数据类型 1. string​​ 2. number​​ 3. ​​boolean​​ 4. null​​ 5. undefined​​ 6. ​​symbol​​(ES6 新增) 7. big…

MySQL数据闪回工具my2sql的使用

场景&#xff1a; 当你或者其它人员误操作数据库不小心删除或者更新了一批数据&#xff0c;但是是当时又没事先备份时&#xff0c;你可以 用这个 my2sql工具快速帮你找回数据。就是如此的丝滑。但是要注意的是只限于dml语句&#xff0c;所以我们在操作数据库前必需先备份哦&…

9.1无法恢复的错误与 panic!

无法恢复的错误与 panic! 有时你的代码中会发生严重问题&#xff0c;而你无能为力。在这些情况下&#xff0c;Rust 提供了 panic! 宏。实际上&#xff0c;有两种方式会导致 panic&#xff1a;一种是执行某个操作使代码产生 panic&#xff08;例如访问数组越界&#xff09;&…

分享低功耗单火线开关语音识别方案

在众多老旧建筑和常规家居环境里&#xff0c;单火线布线是主流方式。单火线语音识别芯片方案通过研发和应用特殊的单火线语音识别芯片&#xff0c;实现设备在单火线供电条件下稳定运行&#xff0c;并精准识别语音指令&#xff0c;为智能家居、智能照明等领域带来便捷的语音控制…

如何在Windows操作系统上通过conda 安装 MDAnalysis

MDAnalysis 是一个开源的 Python 库,旨在提供一个高效且灵活的方式来分析和处理分子动力学(MD)模拟数据。它可以从不同的文件格式中读取模拟轨迹和结构数据,进行复杂的数据处理和分析,广泛应用于生物物理学、化学、材料科学等领域。 一、创建虚拟环境 为了能够顺利安装,减…

实用PDF演示解决方案

它打破了传统阅 读模式&#xff0c;让PDF文档也能像PPT一样流畅播放&#xff0c;特别适合汇报、讲解等展示场景。它是绿色单文件版&#xff0c;无需安装&#xff0c;双击红色图标即点即用。运行后第一件事&#xff0c;建议把界面语言切换成中文&#xff0c;操作更顺手。导入PDF…