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

【算法】(Python)贪心算法

贪心算法:

  • 又称贪婪算法,greedy algorithm。
  • 贪心地追求局部最优解,即每一步当前状态下最优选择。
  • 试图通过各局部最优解达到最终全局最优解。但不从整体最优上考虑,不一定全局最优解。
  • 步骤:从初始状态拆分成一步一步的,每一步确保当前状态最优解,再下一步。
  • 关键:具体的贪心策略(选择能产生问题最优解的最优度量标准)。
  • 使用条件:贪心选择(一个问题最优解可通过一系列局部最优解达到,每一步可依赖以前的选择,不可回溯),最优子结构(一个问题最优解包含其子问题的最优解)。

案例:

1、(难度:简单)【力扣】1710. 卡车上的最大单元数

 解题思路:每一步优先挑选当前可装载的最大单元数量的箱子。

  1. 将列表按单元数量(元素中下标为1的值)降序排列。
  2. 遍历列表中所有元素,
  3. 若当前元素的箱子最大数量已经达到指定总数量,则单元总数=指定总数量*单元数量,并结束,返回单元总数。
  4. 若当前箱子最大数量在指定总数量之内,则当前箱子最大数量*单元数量,累加到单元总数中,剩余指定总数量=指定总数量-当前箱子最大数量;
  5. 再判断列表中下一个元素,
  6. 直到遍历完列表中所有元素,或者达到指定总数量,返回单元总数。

 知识点:列表.sort(key=排序条件, reverse=True):列表按照排序条件降序排列。

class Solution:def maximumUnits(self, boxTypes: List[List[int]], truckSize: int) -> int:# 将列表按单元数量(即各元素下标为1的值)降序排列boxTypes.sort(key=lambda x: x[1], reverse=True)total = 0         # 记录可装载的单元总数# 遍历列表,指定最大数量依次减去最大箱子数量计算剩余数量,并统计单元总数# i为箱子数量,j为每个箱子的单元数量for i, j in boxTypes:if i >= truckSize:total += truckSize * jbreaktotal += i * jtruckSize -= ireturn total

2、(难度:中等)【力扣】714. 买卖股票的最佳时机含手续费

解题思路:买卖为一次交易、计算一次手续费,则买入时计算手续费。买入价尽可能当前最低价,卖出价尽可能当前最高价。

  1. 初始买入价为列表第一日价格(含手续费),
  2. 依次遍历列表中每日价格,
  3. 若当前价(含手续费)<买入价,即当前价格比前一天低,则当前价(含手续费)为新的买入价。若当前价(不含手续费)>买入价,则假装卖出,计算利润(若前一日也假装卖出则利润加上当前价与前一日的差价),并假装当天免手续费买入,即当天价(不含手续费)为买入价,
  4. 下一日价格,当前价再与买入价比较。
  5. 遍历完列表所有元素,返回总利润。
class Solution:def maxProfit(self, prices: List[int], fee: int) -> int:profit = 0                # 记录总收益buy = prices[0] + fee     # 初始买入# 遍历每个价格for i in prices:# 若当前价+手续费<买入价,则当前价买入if i + fee < buy:buy = i + fee# 当前价格>买入价,(假装卖出)计算利润(当前价与买入价的差),# 并假装以当前价免手续费买入(若明天价比当前价高,明天收益就是明天价与当前价之间的差)elif i > buy:profit += (i - buy)buy = ireturn profit

注:本题其他解题方法:动态规划。本文忽略。

3、(难度:困难)【力扣】871. 最低加油次数

解题思路:一个优先队列记录每个加油站的加油量(降序,最大油量在前)。计算每到一个地方的剩余油量,若不足则优先使用最大油量加油。

  1. 遍历每个地方和目的地(n+1),
  2. 计算从上一个位置到达当前地方后的剩余油量,
  3. 若剩余油量不足,则依次从优先队列取出最大油量加油,每加一次统计一次,直到加满或优先队列为空(即没有油可加),
  4. 若加完油后剩余油量仍不足,则无法到达目的地,返回-1,
  5. 每到达一个加油站,将加油量添加到优先队列,并将当前地方设为上一位置,用于下一个地方计算判断油量。

 知识点:二维数组[子数组下标][子数组中元素下标]:获取二维数组中元素。二维数组:数组中的元素类型仍为数组。

               python中heapq库用于操作堆(最小堆,最大堆),应用于优先队列和堆排序。此处为优先队列。

               heapq.heappush(队列, 元素):往优先队列添加元素,自动生成最小堆(父节点小于所有子节点,左右子节点无大小要求)。元素前加负号“-”,则各元素负数后的最小堆,类似最大堆,取出时前面也加负号“-”即为最大值。

               heapq.heappop(队列):从优先队列中取出最小值。

class Solution:def minRefuelStops(self, target: int, startFuel: int, stations: List[List[int]]) -> int:       import heapqres = 0               # 统计加油次数fuel_list = []        # 油量优先队列(最大的在前),记录每个加油站的加油量fuel = startFuel      # 记录目前油量pre = 0               # 记录上一个位置# 遍历每个加油站和目的地n = len(stations)for i in range(n + 1):# 记录当前位置,若加油站则为元素中下标为0的值,若目的地则为targetif i < n: cur = stations[i][0]else: cur = target# 计算达到当前位置,剩余油量fuel -= cur - pre# 若剩余油量<0,且油量优先队列中有元素,依次按最大油量加油,直到加满或油量优先队列为空while fuel < 0 and fuel_list:# 油量优先队列为了从大到小排列,元素是负数fuel += (-heapq.heappop(fuel_list))           # 从优先队列取出最大值res += 1# 若加油后,剩余油量仍<0,说明即使加满油也到不了目的地if fuel < 0: return -1# 每到一个加油站,将油量添加到油量优先队列中if i < n:# 油量优先队列为了从大到小排列,元素是负数heapq.heappush(fuel_list, -stations[i][1])    # 添加到优先队列(最大堆)pre = curreturn res

以上是从上次位置到达该加油站后剩余油量判断,也可以直接判断从起始位置到达各加油站时油量是否充足,若不足则取出油量优先队列的最大值加油。

class Solution:def minRefuelStops(self, target: int, startFuel: int, stations: List[List[int]]) -> int:import heapqh = []         # 油量优先队列(最大的在前),记录每个加油站的加油量res = 0        # 统计加油次数# 遍历每个加油站和目的地for long, fuel in stations + [[target, 0]]:# 若油量不够,则从优先队列取出最大油量加油while startFuel < long:# 若优先队列为空(即没有油可加),即无法到达目的地if not h: return -1startFuel -= heapq.heappop(h)res += 1# 每到一个加油站,就将油量添加到优先队列heapq.heappush(h, -fuel)return res

注:本题其他解题方法:动态规划。本文忽略。

相关文章:

【算法】(Python)贪心算法

贪心算法&#xff1a; 又称贪婪算法&#xff0c;greedy algorithm。贪心地追求局部最优解&#xff0c;即每一步当前状态下最优选择。试图通过各局部最优解达到最终全局最优解。但不从整体最优上考虑&#xff0c;不一定全局最优解。步骤&#xff1a;从初始状态拆分成一步一步的…...

条件logistic回归原理及案例分析

前面介绍的二元、多分类、有序Logistic回归都属于非条件Logistic回归&#xff0c;每个个案均是相互独立关系。在实际研究中&#xff0c;还有另外一种情况&#xff0c;即个案间存在配对关系&#xff0c;比如医学研究中配对设计的病例对照研究&#xff0c;此时违反了个案相互独立…...

redis7学习笔记

文章目录 1. 简介1.1 功能介绍1.1.1 分布式缓存1.1.2 内存存储和持久化(RDBAOF)1.1.3 高可用架构搭配1.1.4 缓存穿透、击穿、雪崩1.1.5 分布式锁1.1.6 队列 1.2 数据类型StringListHashSetZSetGEOHyperLogLogBitmapBitfieldStream 2. 命令2.1 通用命令copydeldumpexistsexpire …...

重学Android:自定义View基础(一)

前言 作为一名安卓开发&#xff0c;也被称为大前端&#xff0c;做一个美观的界面&#xff0c;是我们必备的基础技能&#xff0c;可能在开发中我们最常用的是系统自带的View&#xff0c;因为他能满足绝大部分需求&#xff0c;难一点的我们也可以上Github上找个三方库使用&#…...

前端好用的网站分享——CSS(持续更新中)

1.CSS Scan 点击进入CSS Scan CSS盒子阴影大全 2.渐变背景 点击进入color.oulu 3.CSS简化压缩 点击进入toptal 4.CSS可视化 点击进入CSS可视化 这个强推&#xff0c;话不多说&#xff0c;看图! 5.Marko 点击进入Marko 有很多按钮样式 6.getwaves 点击进入getwaves 生…...

华为HarmonyOS借助AR引擎帮助应用实现虚拟与现实交互的能力3-获取设备位姿

设备位姿描述了物体在真实世界中的位置和朝向。AR Engine提供了世界坐标下6自由度&#xff08;6DoF&#xff09;的位姿计算&#xff0c;包括物体的位置&#xff08;沿x、y、z轴方向位移&#xff09;和朝向&#xff08;绕x、y、z轴旋转&#xff09;。通过AR Engine&#xff0c;您…...

qt QColorDialog详解

1、概述 QColorDialog是Qt框架中的一个对话框类&#xff0c;专门用于让用户选择颜色。它提供了一个标准的颜色选择界面&#xff0c;其中包括基本的颜色选择器&#xff08;如调色板和颜色轮&#xff09;、自定义颜色输入区域以及预定义颜色列表。QColorDialog支持RGB、HSV和十六…...

【测试小白--如何写好测试用例--测试用例编写的方法+结合常见登录模块为实例--保姆级教学】

测试用例编写方法&登录模块实例 一、测试用例编写方法1. 等价类划分2. 边界值分析3. 状态转换测试4. 决策表测试5. 错误推测6. 用户场景测试7. 安全测试用例 二、登录模块测试用例实例1. 等价类划分2. 边界值分析3. 状态转换测试4. 决策表测试5. 错误推测6. 用户场景测试7.…...

真题--数组循环题目

1.逆序数表达数组2.用数组表示费波纳希数列3.用数组排序4.二维数组转置5.找到二维数组其中的最大数值6.输出字符数组7.字符数组输出菱形图案8.输入一行字符&#xff0c;统计有多少单词9.有三个字符串&#xff0c;找到最大字符串 1.逆序数表达数组 #include<stdio.h> int…...

【Linux系列】在Linux下安装微信

文章目录 前言一、通用Linux系统使用Flatpak安装&#xff08;推荐&#xff09;1. 安装flatpak2. 安装微信 二、国产Linux 前言 此前&#xff0c;微信的Linux版一直在内测阶段&#xff0c;只有在国产的Linux系统和Debian系系统上可以正常安装&#xff0c;如果有心细的好伙伴应该…...

还在使用ElementUI不如试一试DaisyUI,DaisyUI: Tailwind CSS 的高效组件库,

DaisyUI: Tailwind CSS 的高效组件库 daisyUI官网&#xff1a;https://daisyui.com/ 在现代网页开发中&#xff0c;快速构建美观且响应式的用户界面是每个开发者追求的目标。Tailwind CSS 是一个流行的实用程序优先的 CSS 框架&#xff0c;它允许开发者直接在 HTML 中使用预…...

高光谱激光雷达遥感团队成员白杰博士获全国激光雷达优博论文奖

\quad \quad 2024年11月1日—4日&#xff0c;第八届全国激光雷达大会在桂林理工大学大学召开。本届大会&#xff0c;国际数字地球学会中国国家委员会激光雷达专业委员会组织了本年度优秀博士学位论文评选&#xff0c;经初评、函评、投票和公示&#xff0c;最终评选出了全国激光…...

24年配置CUDA12.4,Pytorch2.5.1,CUDAnn9.5运行环境

没什么好介绍的&#xff0c;直接说了。 下载 首先打开命令行&#xff0c;输入代码查看显卡最高支持的cuda版本&#xff0c;下载的版本不要高于该版本 nvidia-smi PyTorch 插件这个是PyTorch下载地址&#xff0c;就按照我这么选CUDA版本就选最新的&#xff0c;看好绿框里的CU…...

基于springboot得高校评教教师工作量管理系统设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…...

Rust 力扣 - 1456. 定长子串中元音的最大数目

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们遍历长度为k的窗口&#xff0c;我们只需要记录窗口内的元音字母数量即可&#xff0c;遍历过程中刷新最大数目 题解代码 impl Solution {pub fn max_vowels(s: String, k: i32) -> i32 {let s s.as_byt…...

【Golang】validator库的使用

package mainimport ("fmt""github.com/go-playground/validator" )// MyStruct .. validate:"is-awesome"是一个结构体标签&#xff0c;它告诉验证器使用名为is-awesome的验证规则来验证String字段。 type MyStruct struct {String string vali…...

【AI日记】24.11.06 我对投资的一点浅见

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 投资学习 内容&#xff1a;看投资大佬访谈或演讲B站地址&#xff1a;巴菲特1998年佛州大学讲座目标&#xff1a;学习巴菲特的投资哲学和人生智慧时间&#xff1a;2小时评估&#xff1a;非常不错&#xff0c;值…...

2024江苏省网络建设与运维省赛Linux(一)系统安装

第五部分: Linux 系统配置( 20 分) (一)系统安装 【任务描述】 系统安装 (1)所有 Linux 服务器登录密码设置为 Netw@rkCZ!@#(注意区分大小写) (2)PC1 web 连接 Server2,给 Server2 安装 rocky-arm64 CLI 系统(语言为英文)。 (3)配置 server2 的 IPv4 地址为…...

详解Python面向对象程序设计

Python面向对象程序设计 1&#xff0c;初识类和对象2&#xff0c;类的定义和使用3&#xff0c;构造方法4&#xff0c;常用的类内置方法4.1&#xff0c;字符串方法&#xff1a;__str__ 4.2&#xff0c;是否小于&#xff1a;__lt__4.3&#xff0c;是否小于等于&#xff1a;__le__…...

JS保留两位小数

方法1 var num 3.14159; var result num.toFixed(2); 方法2 toFixed(2) 返回的是字符串&#xff0c;需要转数字。 var num 3.14159; var result parseFloat(num.toFixed(2));...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

高分辨率图像合成归一化流扩展

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 摘要 我们提出了STARFlow&#xff0c;一种基于归一化流的可扩展生成模型&#xff0c;它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流&#xff08;TARFlow&am…...

CVE-2023-25194源码分析与漏洞复现(Kafka JNDI注入)

漏洞概述 漏洞名称&#xff1a;Apache Kafka Connect JNDI注入导致的远程代码执行漏洞 CVE编号&#xff1a;CVE-2023-25194 CVSS评分&#xff1a;8.8 影响版本&#xff1a;Apache Kafka 2.3.0 - 3.3.2 修复版本&#xff1a;≥ 3.4.0 漏洞类型&#xff1a;反序列化导致的远程代…...