【面试高频算法解析】算法练习7 贪心算法

前言

本专栏旨在通过分类学习算法,使您能够牢固掌握不同算法的理论要点。通过策略性地练习精选的经典题目,帮助您深度理解每种算法,避免出现刷了很多算法题,还是一知半解的状态


专栏导航

  1. 二分查找
  2. 回溯(Backtracking)
  3. 双指针
  4. 滑动窗口
  5. 深度优先搜索
  6. 广度优先搜索
  7. 贪心算法
  8. 单调队列
  9. 堆(Heap)

算法解析

贪心算法(Greedy Algorithm)是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法策略。

贪心算法在有最优子结构的问题中尤其有效,这种子结构意味着局部最优解能决定全局最优解。简单地说,一个问题的最优解包含其子问题的最优解。贪心算法不一定能求得所有问题的全局最优解,因为它通常没有考虑前面的选择如何影响后面的选择(即它不回溯)。但在很多情况下,贪心算法可以产生最优解或接近最优的解。

贪心算法的步骤通常如下:

  1. 建立数学模型:将问题抽象为数学模型。

  2. 定义选择过程:明确每一步如何选择最优解。

  3. 证明局部最优能导致全局最优:这是使用贪心算法的关键,需要证明每一步的局部最优解能最终合成全局最优解。

  4. 构建算法:根据定义的模型和选择过程来实现算法。

  5. 求解并验证:运行算法求解,然后验证算法的正确性和效率。

贪心算法常用于解决优化问题,例如:

  • 找零问题:如何用最少的硬币找零。
  • 最小生成树:如Prim算法和Kruskal算法。
  • 任务调度问题:如何安排工作以最小化等待时间或延迟。
  • 图的最短路径问题:如Dijkstra算法。

以下是一个简单的贪心算法示例,解决找零问题:

def coin_change(coins, amount):coins.sort(reverse=True)  # 将硬币从大到小排序num_coins = 0for coin in coins:if amount <= 0:breaknum_coins += amount // coinamount %= coinreturn num_coins if amount == 0 else -1  # 如果无法正好找零,返回-1# 示例
coins = [25, 10, 5, 1]
amount = 63
print(coin_change(coins, amount))  # 输出应该是找零所需的最少硬币数

在这个例子中,算法从最大的硬币开始,尽可能多地使用大硬币,然后逐渐使用更小的硬币,直到找零完成。这个特定问题的贪心策略能够得到最优解,因为硬币的面额都是彼此的倍数。然而对于不是倍数关系的面额,贪心策略可能就无法得到最优解了。因此,使用贪心算法时,需要根据问题的具体情况来判断其适用性。


实战练习

最长回文串

给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 。

在构造过程中,请注意 区分大小写 。比如 “Aa” 不能当做一个回文字符串。

示例 1:
输入:s = “abccccdd”
输出:7
解释: 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

示例 2:
输入:s = “a”
输出:1

示例 3:
输入:s = “aaaaaccc”
输出:7

提示:
1 <= s.length <= 2000
s 只由小写 和/或 大写英文字母组成

官方题解


跳跃游戏II

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。

每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

  • 0 <= j <= nums[i]
  • i + j < n

返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。

示例 1:
输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

示例 2:
输入: nums = [2,3,0,1,4]
输出: 2

提示:
1 <= nums.length <= 104
0 <= nums[i] <= 1000
题目保证可以到达 nums[n-1]

官方题解


买卖股票的最佳时机II

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

返回 你能获得的 最大 利润 。

示例 1:
输入:prices = [7,1,5,3,6,4]
输出:7
解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3 。
总利润为 4 + 3 = 7 。

示例 2:
输入:prices = [1,2,3,4,5]
输出:4
解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。
总利润为 4 。

示例 3:
输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 交易无法获得正利润,所以不参与交易可以获得最大利润,最大利润为 0 。

提示:
1 <= prices.length <= 3 * 104
0 <= prices[i] <= 104

官方题解

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

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

相关文章

Python绘制茎叶图:plt.stem

文章目录 简介参数演示 简介 茎叶图从外观来看&#xff0c;更像是火柴&#xff0c;由基线、茎线、茎头三部分构成。最简单的示例如下 import numpy as np import matplotlib.pyplot as plt plt.stem(np.sin(np.arange(10))) plt.show()参数 stem的完整参数如下 stem([locs,…

大模型缩放法则

KM&#xff08;Kaplan-McCandlish&#xff09;缩放法则 KM缩放法则是由OpenAI的研究员Jared Kaplan和Sam McCandlish提出的&#xff0c;用于描述大型语言模型&#xff08;LLMs&#xff09;如何随着模型大小、数据量和计算资源的增加而提高性能。这个法则基于经验数据表明&…

如何写一个windows上停止nginx的脚本

1.创建脚本 可以使用批处理脚本&#xff08;.bat&#xff09;来停止 Windows 上运行的 Nginx 进程。以下是一个简单的示例&#xff1a; 首先&#xff0c;创建一个名为 stop_nginx.bat 的文本文件&#xff0c;然后将以下命令粘贴到文件中&#xff1a; echo off taskkill /f /…

【C++】- 类和对象(构造函数!析构函数!拷贝构造函数!详解)

类和对象② 类的6个默认成员函数构造函数析构函数拷贝构造函数 类的6个默认成员函数 上一篇详细介绍了类。如果一个类中什么成员都没有&#xff0c;简称为空类。 那么空类中真的什么都没有吗&#xff1f; 并不是&#xff0c;当类在什么都不写时&#xff0c;编译器会自动生成…

塔罗占卜 api数据接口实现及代码示例

塔罗牌&#xff0c;被称为“大自然的奥秘库”。它是西方古老的占卜工具&#xff0c;中世纪起流行于欧洲&#xff0c;其起源一直是个谜&#xff0c;此接口仅处理多牌阵占卜法&#xff0c;不考虑一张牌占卜的情况。 接口名称&#xff1a;占卜-多牌阵占卜法 接口平台&#xff1a…

[算法与数据结构][python][c++]:C++中的this指针和Python中的Self -- 26岁生日

C中的this指针和Python中的Self 1. python中的Self2. C中的this指针3. C中的this指针和Python中self的异同点&#xff1a; 以朋友的新岁祝福开篇&#xff0c;祝笔者也祝大家☺️&#xff1a; 一岁一礼 一寸欢喜且喜且乐 且以永日​ From VardoZ癸卯年十一月廿六(兔年)之…

SQLServer设置端口,并设置SQLServer和SQLServer Browser服务

SQLServer默认使用动态端口&#xff0c;即每次启动sqlserver.exe时&#xff0c;端口port都会动态变化。若要使用静态端口&#xff0c;比如port1433&#xff0c;则需要在SQL Server Configuration Manager(简称SSMS&#xff09;里配置。这里以SQL Server 2005 Configuration Man…

安科瑞有序充电运营场站落成-安科瑞 蒋静

今年6月&#xff0c;发布了《关于进一步构建高质量充电基础设施体系的指导意见》&#xff0c;提出到2030年基本建成高质量充电基础设施体系&#xff0c;以支撑新能源汽车产业的发展和满足人民群众的出行充电需求。7月底&#xff0c;国家部门印发了《关于促进汽车消费的若干措施…

Elasticsearch(实践2)链接库产生TLS验证安全性报错

问题&#xff1a; File "/home/server/miniconda3/envs/rag/lib/python3.8/site-packages/elastic_transport/_transport.py", line 328, in perform_request meta, raw_data node.perform_request( File "/home/server/miniconda3/envs/rag/lib/python3…

应对 DevOps 中的技术债务:创新与稳定性的微妙平衡

技术性债务在DevOps到底意味着什么&#xff1f;从本质上讲&#xff0c;这是小的开发缺陷的积累&#xff0c;需要不断地返工。它可能由多种原因引起&#xff0c;例如快速交付新功能的压力&#xff0c;这可能会导致团队不得不牺牲代码的整洁和完善。但这些不完整的小代码&#xf…

Qt - QML框架

文章目录 1 . 前言2 . 框架生成3 . 框架解析3.1 qml.pro解析3.2 main.cpp解析3.3 main.qml解析 4 . 总结 【极客技术传送门】 : https://blog.csdn.net/Engineer_LU/article/details/135149485 1 . 前言 什么是QML&#xff1f; QML是一种用户界面规范和编程语言。它允许开发人员…

桌面图标变成白色文件?学会这4个方法,轻松解决!

“不知道为什么&#xff0c;我有些文件夹直接保存在电脑桌面了&#xff0c;但是今天查看的时候却发现它们变成了白色的文件。有什么方法可以解决这个问题吗&#xff1f;” 在使用电脑时&#xff0c;可能由于各种原因&#xff0c;会出现桌面图标变成白色文件的情况。这不仅会让用…

docker安裝gocd-server,并配置gitlab授权登录

gocd的地址&#xff1a;Installing GoCD server on Windows | GoCD User Documentation gocd文档&#xff1a;GitHub - gocd/docker-gocd-server: Docker server image for GoCD 一、docker拉取gocd镜像 #拉取server镜像 docker pull gocd/gocd-server:v21.1.0docker pull g…

邦芒解析:十大失误让你的简历石沉大海

​​想知道为什么你的简历没有带来任何面试机会吗&#xff1f;很可能是因为踩了这10个坑~ ​ ​一个小小的错误就很可能让你的求职计划中道崩殂。求职者在写第一份简历时必定有一些需要注意的事项。 ​ 1、缺乏针对性 一份标准模版下做出来的简历适用于多种行业、多个职位…

isaacgym(legged_gym)学习 (二)—— 设置环境地形

isaacgym(legged_gym)学习 &#xff08;二&#xff09;—— 设置环境地形 文章目录 isaacgym(legged_gym)学习 &#xff08;二&#xff09;—— 设置环境地形前言一、了解isaacgym中地形如何构成的二、自定义修改1.代码2.查看script/play.py 总结 前言 如何设置isaacgym中的环…

系列三十七、IDEA设置全局快捷键

一、IDEA设置全局快捷键 1.1、idea默认的快捷键 1.2、修改全局搜索快捷键为Alt F

永磁同步电机的磁场定向控制

目录 概述 通过系统仿真验证行为 探索模型架构 生成用于集成到嵌入式应用程序的控制器 C 代码 指定控制器模型的参考行为 创建 PIL 实现 准备用于 PIL 测试的控制器模型 测试生成的代码的行为和执行时间 结论 此示例说明从电机控制算法生成 C 代码并验证其编译行为和执…

进程间通信之匿名管道和命名管道的理解和实现【Linux】

进程间通信之匿名管道和命名管道的理解和实现 进程间通信什么是管道匿名管道代码实现管道的读写规则管道特点 命名管道创建命名管道代码实现 进程间通信 进程间通信的目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程资源共享&#xff1a;多个进程之间共享同…

【obj To 3DTiles 格式转换】 可以自定义经纬高、属性表等参数 (一)

目录 0 引言1 3DTiles数据2 objTo3DTiles2.1 工具的安装2.1.1 拓展&#xff1a;Node.js 和 npm 2.2 工具的使用2.2.1 输出成瓦片数据2.2.2 输出带有坐标参数的瓦片数据 3 查看3DTiles数据 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;Cesiumfor…

matlab矩阵标准化

在MATLAB中&#xff0c;可以使用函数normalize对矩阵进行标准化。标准化是将矩阵的每个元素减去平均值&#xff0c;然后除以标准差。下面是一个示例&#xff1a; A [1, 2, 3; 4, 5, 6; 7, 8, 9];% 对矩阵A进行标准化 A_normalized normalize(A, center, mean);在上述示例中&…