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

Leetcode基础算法篇|202409(4)贪心算法

贪心算法(Greedy Algorithm):一种在每次决策时,总是采取在当前状态下的最好选择,从而希望导致结果是最好或最优的算法。

学习链接:leetcode-notes/docs/ch04/04.04/04.04.02-Exercises.md at main · datawhalechina/leetcode-notes · GitHub

贪心算法是一种改进的「分步解决算法」,其核心思想是:将求解过程分成「若干个步骤」,然后根据题意选择一种「度量标准」,每个步骤都应用「贪心原则」,选取当前状态下「最好 / 最优选择(局部最优解)」,并以此希望最后得出的结果也是「最好 / 最优结果(全局最优解)」。

贪心算法三步走

  1. 转换问题:将优化问题转换为具有贪心选择性质的问题,即先做出选择,再解决剩下的一个子问题。
  2. 贪心选择性质:根据题意选择一种度量标准,制定贪心策略,选取当前状态下「最好 / 最优选择」,从而得到局部最优解。
  3. 最优子结构性质:根据上一步制定的贪心策略,将贪心选择的局部最优解和子问题的最优解合并起来,得到原问题的最优解。

例题:

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。

你需要按照以下要求,给这些孩子分发糖果:

  • 每个孩子至少分配到 1 个糖果。
  • 相邻两个孩子评分更高的孩子会获得更多的糖果。

请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。

思路:

### 初步思路

#### 1. 找到第一个谷底
首先,我们需要找到评分最低的孩子,并给他分配1个糖果。这个孩子就是我们所谓的“第一个谷底”。

#### 2. 找到下一个谷底
接下来,我们需要找到评分次低的孩子。如果这个孩子与上一个谷底相邻,我们需要比较他们的评分。评分更高的孩子应该获得比上一个谷底多1个糖果。如果不相邻,则直接分配1个糖果。

#### 3. 重复步骤2
继续这个过程,直到所有孩子都被分配糖果。

### 最终思路

在初步思路的基础上,我们发现可以通过两次遍历来简化问题:

1. **从左到右遍历**:确保每个孩子如果比左边的孩子评分高,则获得的糖果比左边的孩子多。
2. **从右到左遍历**:确保每个孩子如果比右边的孩子评分高,则获得的糖果比右边的孩子多。

### 最终思路的实现

class Solution(object):def candy(self, ratings):""":type ratings: List[int]:rtype: int"""n = len(ratings)candies = [1] * n  # 初始化每个孩子至少分配到 1 个糖果# 从左到右遍历,确保每个孩子如果比左边的孩子评分高,则获得的糖果比左边的孩子多for i in range(1, n):if ratings[i] > ratings[i - 1]:candies[i] = candies[i - 1] + 1# 从右到左遍历,确保每个孩子如果比右边的孩子评分高,则获得的糖果比右边的孩子多for i in range(n - 2, -1, -1):if ratings[i] > ratings[i + 1]:candies[i] = max(candies[i], candies[i + 1] + 1)# 返回所有孩子获得的糖果总数return sum(candies)

### 优越性

这种方法的优越性在于:
1. **时间复杂度低**:只需要两次遍历数组,时间复杂度为 `O(n)`,其中 `n` 是孩子的数量。
2. **空间复杂度低**:只需要一个长度为 `n` 的数组来存储每个孩子分配的糖果数量,空间复杂度为 `O(n)`。
3. **逻辑简单**:代码逻辑清晰,易于理解和维护。
4. **正确性高**:通过两次遍历,确保每个孩子获得的糖果数量满足题目要求,即每个孩子至少分配到1个糖果,且相邻两个孩子评分更高的孩子会获得更多的糖果。

http://www.lryc.cn/news/448026.html

相关文章:

  • echarts 导出pdf空白原因
  • 数据结构及基本算法
  • vue3学习记录-computed
  • SQLite3模块使用详解
  • 防火墙详解(三)华为防火墙基础安全策略配置(命令行配置)
  • 假期学习--iOS中的static关键字
  • Maya没有Arnold材质球
  • 面试知识点总结篇三
  • 数据加密标准(DES)详解:原理、步骤及Python实现
  • 每日OJ_牛客_OR59字符串中找出连续最长的数字串_双指针_C++_Java
  • 虚幻引擎UE5如何云渲染,教程来了
  • 使用Python实现图形学光照和着色的光线追踪算法
  • 通过openAI的Chat Completions API实现一个支持追问的ChatGPT功能集成
  • 8,STM32CubeMX配置SPI工程(读取norflash的ID)
  • 【MATLAB源码-第178期】基于matlab的8PSK调制解调系统频偏估计及补偿算法仿真,对比补偿前后的星座图误码率。
  • AIGC学习笔记—minimind详解+训练+推理
  • 计算机毕业设计 在线项目管理与任务分配系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 小程序用户截屏事件
  • HashMap为什么线程不安全?如何实现线程安全
  • Python爬虫之requests模块(一)
  • 当微服务中调度返回大数据量时如何处理
  • 【项目经验分享】深度学习点云算法毕业设计项目案例定制
  • 【Redis 源码】2项目结构说明
  • RP2040 C SDK GPIO和IRQ 唤醒功能使用
  • @Transactional导致数据库连接数不够
  • python3中的string 和bytes有什么区别
  • C~排序算法
  • 基于github创建个人主页
  • apt update时出现证书相关问题,可以关闭apt验证
  • 进阶数据库系列(十三):PostgreSQL 分区分表