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

算法通关村第十七关:青铜挑战-贪心其实很简单

青铜挑战-贪心其实很简单

1. 难以解释的贪心算法

贪心学习法则:直接做题,不考虑贪不贪心

贪心(贪婪)算法
是指在问题尽心求解时,在每一步选择中都采取最好或者最优(最有利)的选择,从而希望能够导致结果最好或者最优的算法

贪心算法所得到的结果不一定是最优的结果,但是都是相对近似最优解的结果

怎么知道什么时候改用贪心呢?
要求要解决的问题具有“最优子结构”

贪心怎么学?
将常见的贪心题都找出来看看大致是什么样子的,学一学就行了

贪心常见的应用场景?

  1. 排序问题:选择排序、拓扑排序
  2. 优先队列:堆排序
  3. 赫夫曼压缩编码
  4. 图里的 Prim、Fruska和Dijkstra算法
  5. 硬币找零问题
  6. 分数背包问题
  7. 并查集的按大小或者高度合并问题,或者排名
  8. 任务调度部分场景
  9. 一些复杂的近似算法

2. 贪心问题举例

2.1 分发饼干

LeetCode 455
https://leetcode.cn/problems/assign-cookies/

思路分析

既要满足小孩的胃口,也不要造成饼干的浪费;
大饼干既可以满足胃口大的孩子,也可以满足胃口小的孩子,就应该优先满足胃口大的;

局部最优:大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个
全局最优:喂饱尽可能多的孩子

贪心策略:考虑胃口,大饼干先喂饱大胃口,最后看能满足几个孩子的需要

  • 先将饼干数组和小孩数组排序
  • 然后从后向前比那里小孩数组,用大饼干优先满足胃口大的,并统计满足孩子的数量

在这里插入图片描述

代码实现

class Solution:def findContentChildren(self, g: List[int], s: List[int]) -> int:g.sort(reverse=True)s.sort(reverse=True)s_len = len(s)s_index = 0count = 0for i in g:if s_index < s_len and i <= s[s_index]:s_index += 1count += 1return count

2.2 柠檬水找零

LeetCode860
https://leetcode.cn/problems/lemonade-change/

思路分析

分析下主要有三种情况

  1. 给的是5,直接收下
  2. 给的是10,给出1个5,此时必须要有1个5才行
  3. 给的是20,优先消耗1个10,再给1个5。如果没有10,给出3个5

局部最优:遇到账单20,优先消耗10,完成本次找零。10只能给20找零,5更万能

代码实现

class Solution:def lemonadeChange(self, bills: List[int]) -> bool:count_5 = 0count_10 = 0for money in bills:if money == 5:count_5 += 1elif money == 10:count_5 -= 1count_10 += 1elif money == 20:if count_10 > 0:count_10 -= 1count_5 -= 1else:count_5 -= 3if count_5 < 0 or count_10 < 0:return Falsereturn True

2.3 分发糖果

LeetCode 135
https://leetcode.cn/problems/candy/

思路分析

每个孩子至少一个糖果
相邻孩子评分更高的获得更多的糖果

  • 第一轮,从左到右
    • 只要右边的比左边的大,就一直加1
    • 如果右边比左边小,就设置为1
  • 第二轮,从右到左
    • 如果左边的比右边的大,在{i+1}的基础上,先加1再赋值给{i}
  • 每个位置i,从left[i]和right[i]中选最大就行了
第一轮
下标 0 1 2 3 4 5 6
得分 1 2 2 5 4 3 2
糖果 1 2 1 2 1 1 1第二轮
下标 0 1 2 3 4 5 6
得分 1 2 2 5 4 3 2
糖果 1 2 1 4 3 2 1选取最大
下标 0 1 2 3 4 5 6
得分 1 2 2 5 4 3 2
糖果 1 2 1 4 3 2 1第一轮
下标 0 1 2 3 4
得分 1 3 4 5 2
糖果 1 2 3 4 1第二轮
下标 0 1 2 3 4
得分 1 3 4 5 2
糖果 1 2 3 2 1选取最大
下标 0 1 2 3 4
得分 1 3 4 5 2
糖果 1 2 3 4 1

代码实现

class Solution:def candy(self, ratings: List[int]) -> int:n = len(ratings)candy_list = [0] * ncandy_list[0] = 1 for i in range(1, n):if ratings[i] > ratings[i-1]:candy_list[i] = candy_list[i-1] + 1else:candy_list[i] = 1for i in range(n-2, -1, -1):if ratings[i] > ratings[i+1]:candy_list[i] = max(candy_list[i+1] + 1, candy_list[i])return sum(candy_list)

相关文章:

算法通关村第十七关:青铜挑战-贪心其实很简单

青铜挑战-贪心其实很简单 1. 难以解释的贪心算法 贪心学习法则&#xff1a;直接做题&#xff0c;不考虑贪不贪心 贪心(贪婪)算法 是指在问题尽心求解时&#xff0c;在每一步选择中都采取最好或者最优&#xff08;最有利&#xff09;的选择&#xff0c;从而希望能够导致结果最…...

[Vue3 博物馆管理系统] 使用Vue3、Element-plus的Layout 布局构建组图文章

系列文章目录 第一章 定制上中下&#xff08;顶部菜单、底部区域、中间主区域显示&#xff09;三层结构首页 第二章 使用Vue3、Element-plus菜单组件构建菜单 第三章 使用Vue3、Element-plus走马灯组件构建轮播图 第四章 使用Vue3、Element-plus tabs组件构建选项卡功能 第五章…...

【LeetCode算法系列题解】第36~40题

CONTENTS LeetCode 36. 有效的数独&#xff08;中等&#xff09;LeetCode 37. 解数独&#xff08;困难&#xff09;LeetCode 38. 外观数列&#xff08;中等&#xff09;LeetCode 39. 组合总和&#xff08;中等&#xff09;LeetCode 40. 组合总和 II&#xff08;中等&#xff09…...

java+ssm+mysql电梯管理系统

项目介绍&#xff1a; 使用javassmmysql开发的电梯管理系统&#xff0c;系统包含管理员&#xff0c;监管员、安全员、维保员角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;系统用户管理&#xff08;监管员、安全员、维保员&#xff09;&#xff1b;系统公告&#…...

最近读书了吗?林曦老师与你分享来自暄桐课堂的读书方法

近来&#xff0c;大家有在开心读书吗&#xff1f;对于读书&#xff0c;有一个很生动的说法&#xff1a;“无事常读书&#xff0c;一日是四日。若活七十年&#xff0c;便二百八十。”读书帮助我们超越个体生命经验的限制&#xff0c;此时此地的我们&#xff0c;也可借由书本&…...

【AI理论学习】语言模型:从Word Embedding到ELMo

语言模型&#xff1a;从Word Embedding到ELMo ELMo原理Bi-LM总结参考资料 本文主要介绍一种建立在LSTM基础上的ELMo预训练模型。2013年的Word2Vec及2014年的GloVe的工作中&#xff0c;每个词对应一个vector&#xff0c;对于多义词无能为力。ELMo的工作对于此&#xff0c;提出了…...

多功能透明屏,在智能家居领域中,有哪些功能特点?显示、连接

多功能透明屏是一种新型的显示技术&#xff0c;它能够在透明的表面上显示图像和视频&#xff0c;并且具有多种功能。 这种屏幕可以应用于各种领域&#xff0c;如商业广告、智能家居、教育等&#xff0c;为用户提供更加便捷和多样化的体验。 首先&#xff0c;多功能透明屏可以…...

【List篇】ArrayList 详解(含图示说明)

Java中的ArrayList是一个动态数组&#xff0c;可以自动扩展容量以适应数据的添加和删除。它可以用来存储各种类型的数据&#xff0c;例如String&#xff0c;Integer&#xff0c;Boolean等。ArrayList实现了List接口&#xff0c;可以进行常见的List操作&#xff0c;例如添加、插…...

SSL证书只有收费的吗?有没有免费使用的?

首先明白SSL证书是什么SSL英文全称&#xff1a;英文全称: Secure Socket Layer Certificate,中文全称:安全套接字层证书。 SSL是一种由数字证书颁发机构(CA) 签发的数字证书。它用于建立安全的加密连接&#xff0c;确保通过网络传输的数据在客户端和服务器之间的安全性和完整性…...

48V轻混技术

文章目录 48V轻混技术的主要特点和优势48V轻混技术的优缺点优点&#xff1a;缺点&#xff1a; 48V轻混技术的主要特点和优势 48V轻混技术&#xff08;48V Mild Hybrid Technology&#xff09;是一种汽车动力系统技术&#xff0c;它结合了内燃机和电动机的优势&#xff0c;以提…...

机器学习基础算法--回归类型和评价分析

目录 1.数据归一化处理 2.数据标准化处理 3.Lasso回归模型 4.岭回归模型 5.评价指标计算 1.数据归一化处理 """ x的归一化的方法还是比较多的我们就选取最为基本的归一化方法 x(x-x_min)/(x_max-x_min) """ import numpy as np from sklea…...

MATLAB 软件功能简介

MATLAB 的名称源自 Matrix Laboratory,1984 年由美国 Mathworks 公司推向市场。 它是一种科学计算软件&#xff0c;专门以矩阵的形式处理数据。MATLAB 将高性能的数值计算和可 视化集成在一起&#xff0c;并提供了大量的内置函数&#xff0c;从而被广泛的应用于科学计算、控制…...

deepfm内容理解

对于CTR问题&#xff0c;被证明的最有效的提升任务表现的策略是特征组合(Feature Interaction)&#xff1b; 两个问题&#xff1a; 如何更好地学习特征组合&#xff0c;进而更加精确地描述数据的特点&#xff1b; 如何更高效的学习特征组合。 DNN局限 &#xff1a;当我们使…...

postgresql-集合运算

postgresql-集合运算 并集交集差集集合运算符的优先级 并集 create table excellent_emp( year int not null, emp_id integer not null, constraint pk_excellent_emp primary key(year,emp_id) );insert into excellent_emp values(2018,9); insert into excellent_emp value…...

[持续更新]计算机经典面试题基础篇Day2

[通用]计算机经典面试题基础篇Day2 1、单例模式是什么&#xff0c;线程安全吗 单例模式是一种设计模式&#xff0c;旨在确保一个类只有一个实例&#xff0c;并提供全局访问点。通过使用单例模式&#xff0c;可以避免多次创建相同的对象&#xff0c;节省内存资源&#xff0c;同…...

C++:类和对象(二)

本文主要介绍&#xff1a;构造函数、析构函数、拷贝构造函数、赋值运算符重载、const成员函数、取地址及const取地址操作符重载。 目录 一、类的六个默认成员函数 二、构造函数 1.概念 2.特性 三、析构函数 1.概念 2.特性 四、拷贝构造函数 1.概念 2.特征 五、赋值…...

Java“牵手”京东商品详情数据,京东商品详情API接口,京东API接口申请指南

京东平台商品详情接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取京东商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片等详细信息 。 获取商品详情接口API是一种用于获取电商平台上商品详情数据的接口&#xff0c;通过…...

Fluidd摄像头公网无法正常显示修复一例

Fluidd摄像头在内网正常显示&#xff0c;公网一直无法显示&#xff0c;经过排查发现由于url加了端口号引起的&#xff0c;摄像头url中正常填写的是/webcam?actionsnapshot&#xff0c;或者/webcam?actionstream。但是由于nginx跳转机制&#xff0c;会被301跳转到/webcam/?ac…...

【C++ 学习 ⑳】- 详解二叉搜索树

目录 一、概念 二、实现 2.1 - BST.h 2.2 - test.cpp 三、应用 四、性能分析 一、概念 二叉搜索树&#xff08;BST&#xff0c;Binary Search Tree&#xff09;&#xff0c;又称二叉排序树或二叉查找树。 二叉搜索树是一棵二叉树&#xff0c;可以为空&#xff1b;如果不…...

Java中网络的基本介绍。网络通信,网络,ip地址,域名,端口,网络通信协议,TCP/IP传输过程,网络通信协议模型,TCP协议,UDP协议

- 网络通信 概念&#xff1a;网络通信是指通过计算机网络进行信息传输的过程&#xff0c;包括数据传输、语音通话、视频会议等。在网络通信中&#xff0c;数据被分成一系列的数据包&#xff0c;并通过网络传输到目的地。在数据传输过程中&#xff0c;需要确保数据的完整性、准…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域&#xff0c;REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名&#xff0c;不断适应这些现代范式的需求。随着不断发展的生态系统&#xff0c;Java 在现代 API 方…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

学习一下用鸿蒙​​DevEco Studio HarmonyOS5实现百度地图

在鸿蒙&#xff08;HarmonyOS5&#xff09;中集成百度地图&#xff0c;可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API&#xff0c;可以构建跨设备的定位、导航和地图展示功能。 ​​1. 鸿蒙环境准备​​ ​​开发工具​​&#xff1a;下载安装 ​​De…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...