【贪心算法】leetcode刷题
贪心算法无固定套路。
核心思想:先找局部最优,再扩展到全局最优。
455.分发饼干
两种思路:
1、从大到小。局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩。先遍历的胃口,在遍历的饼干
class Solution:def findContentChildren(self, g: List[int], s: List[int]) -> int:g = sorted(g,reverse=True)s = sorted(s,reverse=True)count = 0si = 0for gi in g:if si<len(s) and s[si]>=gi: # 饼干要大于胃的容量,才能喂饱count+=1si+=1 return count
2、从小到大。小饼干先喂饱小胃口。两个循环的顺序改变了,先遍历的饼干,在遍历的胃口,这是因为遍历顺序变了,我们是从小到大遍历。
class Solution:def findContentChildren(self, g: List[int], s: List[int]) -> int:g = sorted(g)s = sorted(s)count = 0gi = 0for si in s:if gi<len(g) and g[gi]<=si: # 胃的容量要小于等于饼干大小才能喂饱count+=1gi+=1 return count
376. 摆动序列
具体实例:
局部最优:删除单调坡度上的节点(不包括单调坡度两端的节点),那么这个坡度就可以有两个局部峰值。
**整体最优:**整个序列有最多的局部峰值,从而达到最长摆动序列。
考虑几种情况:
- 情况一:上下坡中有平坡
- 情况二:数组首尾两端
- 情况三:单调坡中有平坡
情况一:上下坡中有平坡
它的摇摆序列长度是多少呢? 其实是长度是 3,也就是我们在删除的时候 要不删除左面的三个 2,要不就删除右边的三个 2。
在图中,当 i 指向第一个 2 的时候,prediff > 0 && curdiff = 0 ,当 i 指向最后一个 2 的时候 prediff = 0 && curdiff < 0。
如果我们采用,删左面三个 2 的规则,那么 当 prediff = 0 && curdiff < 0 也要记录一个峰值,因为他是把之前相同的元素都删掉留下的峰值。
所以我们记录峰值的条件应该是: (preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0),为什么这里允许 prediff == 0 ,就是为了 上面我说的这种情况。
情况二:数组首尾两端
例如序列[2,5],如果靠统计差值来计算峰值个数就需要考虑数组最左面和最右面的特殊情况。
因为我们在计算 prediff(nums[i] - nums[i-1]) 和 curdiff(nums[i+1] - nums[i])的时候,至少需要三个数字才能计算,而数组只有两个数字。
这里我们可以写死,就是 如果只有两个元素,且元素不同,那么结果为 2。
情况三:单调坡度有平坡
class Solution:def wiggleMaxLength(self, nums: List[int]) -> int:count = 1# 情况二,小于等于2的情况,可以写死if len(nums)<2:return len(nums)if len(nums)==2:if nums[-1]-nums[0]==0:return 1return len(nums)# 情况一以及情况三:prediff = 0for i in range(0,len(nums)-1):# if i>0:# prediff = nums[i-1]-nums[i]curdiff = nums[i]-nums[i+1]if (prediff<=0 and curdiff>0) or (prediff>=0 and curdiff<0):count+=1prediff = curdiff # 更新prediffreturn count
122.买卖股票的最佳时机 II
如果想到其实最终利润是可以分解的,那么本题就很容易了!
如何分解呢?
假如第 0 天买入,第 3 天卖出,那么利润为:prices[3] - prices[0]。
相当于==(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])==。
此时就是把利润分解为每天为单位的维度,而不是从 0 天到第 3 天整体去考虑!
那么根据 prices 可以得到每天的利润序列:(prices[i] - prices[i - 1])…(prices[1] - prices[0])。
- 局部最优:收集每天的正利润,全局最优:求得最大利润。
class Solution:def maxProfit(self, prices: List[int]) -> int:n = len(prices)dp = [0]*(n-1)for i in range(1,n):dp[i-1] = prices[i]-prices[i-1]res = 0for i in dp:if i>0:res+=ireturn res
55. 跳跃游戏
每次移动取最大跳跃步数(得到最大的覆盖范围),每移动一个单位,就更新最大覆盖范围。
贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点。
i 每次移动只能在 cover 的范围内移动,每移动一个元素,cover 得到该元素数值(新的覆盖范围)的补充,让 i 继续移动下去。
而 cover 每次只取 max(该元素数值补充后的范围, cover 本身范围)。
如果 cover 大于等于了终点下标,直接 return true 就可以了。
class Solution:def canJump(self, nums: List[int]) -> bool:n = len(nums)cover = 0if n<2:return Truefor i in range(n-1):if cover>=i:cover = max(cover,i+nums[i])if cover>=n-1:return Truereturn False
45.跳跃游戏 II
如果移动下标等于当前覆盖最大距离下标, 需要再走一步(即 ans++),因为最后一步一定是可以到的终点。(题目假设总是可以到达数组的最后一个位置),如图:
如果移动下标不等于当前覆盖最大距离下标,说明当前覆盖最远距离就可以直接达到终点了,不需要再走一步。如图:
class Solution:def jump(self, nums: List[int]) -> int:cur_distance = 0 # 当前覆盖的最远距离下标ans = 0 # 记录走的最大步数next_distance = 0 # 下一步覆盖的最远距离下标for i in range(len(nums) - 1): # 注意这里是小于len(nums) - 1,这是关键所在next_distance = max(nums[i] + i, next_distance) # 更新下一步覆盖的最远距离下标if i == cur_distance: # 遇到当前覆盖的最远距离下标cur_distance = next_distance # 更新当前覆盖的最远距离下标ans += 1return ans
1005.K次取反后最大化的数组和
class Solution:def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:nums.sort(key=lambda x:abs(x),reverse=True) # 按照绝对值的个数排序,且从大到小,为了后面先将前k个大负数进行翻转为正数,保证和最大for i in range(len(nums)):if nums[i]<0 and k>0: # 将负数都翻转为正数k-=1nums[i] = -nums[i]# 现在全部都是正数了if k%2==1: # 如果还剩奇数个,则将最小的正数翻转nums[-1] = -nums[-1]# 如果是偶数,其实不用管,因为随便翻转个正数偶数次就可以了,不影响最后结果return sum(nums)
134. 加油站
135.分发糖果
- 从左到右:
如果ratings[i] > ratings[i - 1] 那么[i]的糖 一定要比[i - 1]的糖多一个,所以贪心:candyVec[i] = candyVec[i - 1] + 1
- 从右到左考虑:
再确定左孩子大于右孩子的情况(从后向前遍历)
遍历顺序这里有同学可能会有疑问,为什么不能从前向后遍历呢?
因为 rating[5]与rating[4]的比较 要利用上 rating[5]与rating[6]的比较结果,所以 要从后向前遍历。
如果从前向后遍历,rating[5]与rating[4]的比较 就不能用上 rating[5]与rating[6]的比较结果了 。如图:
如果 ratings[i] > ratings[i + 1],此时candyVec[i](第i个小孩的糖果数量)就有两个选择了,一个是candyVec[i + 1] + 1(从右边这个加1得到的糖果数量),一个是candyVec[i](之前比较右孩子大于左孩子得到的糖果数量)。
那么又要贪心了,局部最优:取candyVec[i + 1] + 1 和 candyVec[i] 最大的糖果数量,保证第i个小孩的糖果数量既大于左边的也大于右边的。全局最优:相邻的孩子中,评分高的孩子获得更多的糖果。
所以就取candyVec[i + 1] + 1 和 candyVec[i] 最大的糖果数量,candyVec[i]只有取最大的才能既保持对左边candyVec[i - 1]的糖果多,也比右边candyVec[i + 1]的糖果多。
class Solution:def candy(self, ratings: List[int]) -> int:k = len(ratings)dp = [1]*k# 从左到右for i in range(k):if i>0 and ratings[i]>ratings[i-1]:dp[i] = dp[i-1]+1# 从右到左for i in range(k-2,-1,-1):if ratings[i]>ratings[i+1]:dp[i] = max(dp[i+1]+1,dp[i]) # 关键点 见解析return sum(dp)
860. 柠檬水找零
class Solution:def lemonadeChange(self, bills: List[int]) -> bool:if bills[0] != 5:return Falsen = len(bills)counter = {5: 0}for i in range(n):remain = bills[i]# 添加if remain in counter.keys():counter[remain] += 1else:counter[remain] = 1# 删除 # 若有20的,先找10元的。if remain // 10 > 1 and 10 in counter.keys():if counter[10] >= (remain // 10) - 1: # 先找10元的。counter[10] = counter[10] - ((remain // 10) - 1)remain = ((remain // 10) - 1) * 10# 删除 若是10/20,则进行删除操作if remain // 5 > 1:if counter[5] >= (remain // 5) - 1: # 再找5元的。剩余的5个数,大于需要找回的。counter[5] = counter[5] - ((remain // 5) - 1)else:return Falsereturn True
相关文章:
![](https://img-blog.csdnimg.cn/566d524ca8444199ade1fd3caf2b8290.png)
【贪心算法】leetcode刷题
贪心算法无固定套路。 核心思想:先找局部最优,再扩展到全局最优。 455.分发饼干 两种思路: 1、从大到小。局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩。先遍历的胃口&a…...
![](https://www.ngui.cc/images/no-images.jpg)
PyMySQL库版本引起的python执行sql编码错误
前言 长话短说,之前在A主机(centos7.9)上运行的py脚本拿到B主机上(centos7.9)运行报错: UnicodeEncodeError: latin-1 codec cant encode characters in position 265-266: ordinal not in range(256)两个…...
![](https://img-blog.csdnimg.cn/4de60de0ac884d318ccc84865efc649f.png)
第二章-算法
第二章-算法 数据结构和算法的关系 算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 算法的特性 算法有五个基本特征:输入、输出、有穷性、确定性和可行性。 输入:算法具…...
![](https://img-blog.csdnimg.cn/img_convert/628fb76b58bf98e59c0f289a0d66007c.png)
‘vue’不是内部或外部命令,也不是可运行的程序或批处理文件的原因及解决方法
今天我在用node.js的时候,结果出现如下错误: C:\Users\xiesj> vue -v vue不是内部或外部命令,也不是可运行的程序或批处理文件。 原因: 1、确定npm是否已正确安装? 2、确定vue以及vue-cli已正确安装?…...
![](https://img-blog.csdnimg.cn/88c5699eb4234f1aa4fa5e6f12d6c38a.png)
HBase API
我们之后的实际开发中不可能在服务器那边直接使用shell命令一直敲的,一般都是通过API进行操作的。 环境准备 新建Maven项目,导入Maven依赖 <dependencies><dependency><groupId>org.apache.hbase</groupId><artifactId>…...
![](https://img-blog.csdnimg.cn/9794c776c8114a25aa1ee1af42e2698c.png)
Qt6之QListWidget——Qt仿ToDesk侧边栏(1)
一、 QLitWidget概述 注意:本文不是简单翻译Qt文档或者接口函数,而侧重于无代码Qt设计器下演示使用。 QListWidget也称列表框类,它提供了一个类似于QListView提供的列表视图,但是它具有一个用于添加和删除项的经典的基于项的接口…...
![](https://img-blog.csdnimg.cn/69a957fc9a9040c88dfe47d0865c7aca.png)
Prometheus技术文档--基本安装-docker安装并挂载数据卷-《十分钟搭建》
一、查看可安装的版本 docker search prom/prometheus 二、拉取镜像 docker pull prom/prometheus 三、查看镜像 docker images 四、书写配置文件-以及创建挂载目录 宿主机挂载目录位置: 以及准备对应的挂载目录: /usr/local/docker/promethues/se…...
![](https://img-blog.csdnimg.cn/4b7c9682901245638035d0a580cce1ce.png)
Android 数据库之GreenDAO
GreenDAO 是一款开源的面向 Android 的轻便、快捷的 ORM 框架,将 Java 对象映射到 SQLite 数据库中,我们操作数据库的时候,不再需要编写复杂的 SQL语句, 在性能方面,greenDAO 针对 Android 进行了高度优化,…...
![](https://www.ngui.cc/images/no-images.jpg)
kotlin 编写一个简单的天气预报app(六)使用recyclerView显示forecast内容
要使用RecyclerView显示天气预报的内容 先在grandle里添加recyclerView的引用 implementation androidx.recyclerview:recyclerview:1.3.1创建一个RecyclerView控件:在布局文件中,添加一个RecyclerView控件,用于显示天气预报的列表。 这是一…...
![](https://img-blog.csdnimg.cn/5efea624bc974eb4937007ccb80e95aa.png)
jpa Page 1 of 0 containing UNKNOWN instances错误关于like问题的解决记录
导致这个问题的原因很多,这里记录一下我碰到的问题和解决方法。 网上有说时 pageNo要从0开始,我的不是这个问题。 在使用springboot jpa时,发现使用 t.ip like %?5% 语句,如果数据库记录的ip is null时,将查询不到该…...
![](https://img-blog.csdnimg.cn/img_convert/add7dec19569a89c3e551dcca2a4ace0.png)
Python实战之使用Python进行数据挖掘详解
一、Python数据挖掘 1.1 数据挖掘是什么? 数据挖掘是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中,通过算法,找出其中的规律、知识、信息的过程。Python作为一门广泛应用的编程语言,拥有丰富的数据挖掘库&#…...
![](https://www.ngui.cc/images/no-images.jpg)
scala 加载properties文件
利用java.util.Properties加载 import java.io.FileInputStream import java.util.Properties object LoadParameter {//动态获取properties文件可配置参数val props new Properties()def getParameter(s:String,filePath:String): String {props.load(new FileInputStream(f…...
![](https://img-blog.csdnimg.cn/img_convert/4f2eba7a95cb5270523bb922d12d243f.png)
备战秋招012(20230808)
文章目录 前言一、今天学习了什么?二、动态规划1.概念2.题目 总结 前言 提示:这里为每天自己的学习内容心情总结; Learn By Doing,Now or Never,Writing is organized thinking. 提示:以下是本篇文章正文…...
![](https://www.ngui.cc/images/no-images.jpg)
QT中定时器的使用
文章目录 概述步骤 概述 Qt中使用定时器大致有两种,本篇暂时仅描述使用QTimer实现定时器 步骤 // 1.创建定时器对象 QTimer *timer new QTimer(this);// 2.开启一个定时器,5秒触发一次 timer->start(5000); // 3.建立信号槽连接&am…...
![](https://img-blog.csdnimg.cn/011c2b6cc2b84f7996cf30cdda565a12.png)
【UE4】多人联机教程(重点笔记)
效果 1. 创建房间、搜索房间功能 2. 根据指定IP和端口加入游戏 步骤 1. 新建一个第三人称角色模板工程 2. 创建一个空白关卡,这里命名为“InitMap” 3. 新建一个控件蓝图,这里命名为“UMG_ConnectMenu” 在关卡蓝图中显示该控件蓝图 打开“UMG_Connec…...
![](https://www.ngui.cc/images/no-images.jpg)
【go】GIN参数重复绑定报错EOF问题
文章目录 1 问题描述2 解决:替换为ShouldBindBodyWith 1 问题描述 在 Gin 框架中,当多次调用 ShouldBind() 或 ShouldBindJSON() 方法时,会导致请求体的数据流被读取多次,从而出现 “EOF” 错误。 例如在api层绑定了参数&#x…...
![](https://img-blog.csdnimg.cn/img_convert/5e0783a0a40da28b856d98b89c7c9e28.png)
关于MySQL中的binlog
介绍 undo log 和 redo log是由Inno DB存储引擎生成的。 在MySQL服务器架构中,分为三层:连接层、服务层(server层)、执行层(存储引擎层) bin log 是 binary log的缩写,即二进制日志。 MySQL…...
![](https://www.ngui.cc/images/no-images.jpg)
我维护电脑的方法
无论是学习还是工作,电脑都是IT人必不可少的重要武器,一台好电脑除了自身配置要经得起考验,后期主人对它的维护也是决定它寿命的重要因素! 你日常是怎么维护你的“战友”的呢,维护电脑运行你有什么好的建议吗ÿ…...
![](https://img-blog.csdnimg.cn/img_convert/d40066014c0d3a4528da827dcb2e05d2.jpeg)
AP51656 电流采样降压恒流驱动IC RGB PWM深度调光 LED电源驱动
产品描述 AP51656是一款连续电感电流导通模式的降压恒流源,用于驱动一颗或多颗串联LED 输入电压范围从 5 V 到 60V,输出电流 可达 1.5A 。根据不同的输入电压和 外部器件, 可以驱动高达数十瓦的 LED。 内置功率开关,采用电流采样…...
![](https://img-blog.csdnimg.cn/2322c85b8af149aeb64d898afa376e3a.png)
Python爬虫的解析(学习于b站尚硅谷)
目录 一、xpath 1.xpath插件的安装 2. xpath的基本使用 (1)xpath的使用方法与基本语法(路径查询、谓词查询、内容查询(使用text查看标签内容)、属性查询、模糊查询、逻辑运算) (2&a…...
![](https://img-blog.csdnimg.cn/3c598304fc694897b7e1479aee692cd9.png)
python的virtualenv虚拟环境无法激活activate
目录 问题描述: 解决办法: 解决结果: 问题描述: PS D:\pythonProject\pythonProject\DisplayToolLibs\venv\Scripts> .\activate .\activate : 无法加载文件 D:\pythonProject\pythonProject\DisplayToolLibs\venv\Scripts\…...
![](https://www.ngui.cc/images/no-images.jpg)
uniapp中token操作:存储、获取、失效处理。
实现代码 存储token:uni.setStorageSync(token, res.data.result);获取token:uni.getStorageSync(token);清除token:uni.setStorageSync(token, ); 应用场景 在登录操作中,保存token pwdLogin() {....this.$axios.request({url: .....,method: post,p…...
![](https://www.ngui.cc/images/no-images.jpg)
乐鑫科技 2022 笔试面试题
岗位:嵌入式软件实习生。 个人情况:本科双非电子信息工程,硕士华五软件工程研一在读;本科做过一些很水的项目 ,也拿项目搞了一些奖,相对来说嵌入式方向比较对口。 时间线及面试流程 2021.04.02 笔试 题目分为选择题和编程题,选择题二十题,编程题两题; 选择题基本…...
![](https://img-blog.csdnimg.cn/086896aab5e8406db42682056e08227c.png)
实现UDP可靠性传输
文章目录 1、TCP协议介绍1.1、ARQ协议1.2、停等式1.3、回退n帧1.4、选择性重传 1、TCP协议介绍 TCP协议是基于IP协议,面向连接,可靠基于字节流的传输层协议 1、基于IP协议:TCP协议是基于IP协议之上传输的,TCP协议报文中的源端口IP…...
![](https://img-blog.csdnimg.cn/img_convert/69bccac8bdd67290bd3bb695fdb49e71.jpeg)
Zebec Protocol 将进军尼泊尔市场,通过 Zebec Card 推动地区金融平等
流支付正在成为一种全新的支付形态,Zebec Protocol 作为流支付的主要推崇者,正在积极的推动该支付方案向更广泛的应用场景拓展。目前,Zebec Protocol 成功的将流支付应用在薪酬支付领域,并通过收购 WageLink 将其纳入旗下…...
![](https://img-blog.csdnimg.cn/2c8f006de54942f38ee695fd6bee9ae8.png)
Qt--动态链接库的创建和使用
写在前面 在Qt的实际开发中,免不了使用和创建动态链接库,因此熟悉Qt中动态链接库的创建和使用对后续的库开发或使用是非常用必要的。 在之前的文章https://blog.csdn.net/SNAKEpc12138/article/details/126189926?spm1001.2014.3001.5501中已经对导入…...
![](https://www.ngui.cc/images/no-images.jpg)
设计模式十二:享元模式(Flyweight Pattern)
当我们需要创建大量相似对象时,享元模式可以帮助我们节省内存空间和提高性能。该模式通过共享相同的数据来减少对象的数量。 在享元模式中,有两种类型的对象:享元(Flyweight)和非享元(Unshared Flyweight&a…...
![](https://www.ngui.cc/images/no-images.jpg)
【LeetCode】88. 合并两个有序数组 - 双指针
这里写自定义目录标题 2023-8-7 22:35:41 88. 合并两个有序数组 双指针 2023-8-7 22:35:41 class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int last m n ;while(n > 0){if(m > 0 && nums2[n-1] > nums1[m-1]){nums1[las…...
![](https://communityfile-drcn.op.hicloud.com/FileServer/getFile/cmtybbs/042/413/002/0000000000042413002.20230805095253.26989211028932842263323628487935:20230805095433:2800:5E79DEEAC5F10CADA07D8437D864482EA71CD102EC13F923FCF0D6B2D58ED5D9.png)
HarmonyOS应用开发的新机遇与挑战
HarmonyOS 4已经于2023年8月4日在HDC2023大会上正式官宣。对广大HarmonyOS开发者而言,这次一次盛大的大会。截至目前,鸿蒙生态设备已达7亿台,HarmonyOS开发者人数超过220万。鸿蒙生态充满着新机遇,也必将带来新的挑战。 HarmonyO…...
![](https://www.ngui.cc/images/no-images.jpg)
Qt中qmake、构建、运行、清理的区别
Qt 中默认的执行顺序:qmake--- 编译 --- 运行。 一、qmake qmake: 根据之前项目指南创建的项目文件 .pro,并且运行 qmake [qmake xx.pro]生成调试 [build-ttt-***-Debug] 或者发布 [build-ttt-***-Release] 目录(这个是影子构建…...
![](/images/no-images.jpg)
网站营销方式/今日十大热点新闻头条
写在前面 本文首发于公众号:符合预期的CoyPan 最近做了一个移动端活动页的需求,大概就是diy一个页面。用户可以对物料进行拖动、缩放、旋转,来达到diy的目的。用DOM来实现是不现实的,我采用了canvas来实现和用户的交互。开发过程中…...
![](/images/no-images.jpg)
四川润邦建设工程设计有限公司网站/电商seo
/** 切片函数,非常重要,这里一定要牢记beginIndex是开始位置,endIndex是结束位置,区别于以前学的offset是开始位置,而count或length是个数和长度* 比如说,new String("abcdefg",1,3)得到的是bcd*…...
![](/images/no-images.jpg)
手机怎么做网站服务器/哪个网站学seo是免费的
说的更通俗一点,域名迁移就是修改域名的权威DNS,即将域名ABC.COM的原权威DNS由A迁移到B。实际工作中最常见的形式是将域名转到另一家DNS服务商来解析。本文就域名迁移过程中几个值得关注的问题讨论一下。 一、为什么要域名迁移?通常情况下,…...
![](/images/no-images.jpg)
企业网站建设哪家便宜/营销策略国内外文献综述
常用的几条NET命令: 1. 知道对方ip查看对方的计算机名 方法:开始->运行->cmd->net view 对方ip 或者 开始->运行->cmd->nbtstat -a 对方ip 2. 知道对方计算机名查看对方ip 方法:开始->运行->cmd->ping 对方计算机…...
![](https://www.oschina.net/img/hot3.png)
代理加盟微信网站建设/网页模板代码
2019独角兽企业重金招聘Python工程师标准>>> 删除 List 中的元素会产生两个问题: 删除元素后 List 的元素数量会发生变化;对 List 进行删除操作可能会产生并发问题;我们通过代码示例演示正确的删除逻辑 package com.ips.list;impo…...
![](/images/no-images.jpg)
东莞网站建设-信科网络/鞋子软文推广300字
导读: "虚拟导游空气中讲解"有望亮相世博会 [来 源] 新闻晚报 [发表时间] 2007-9-12 [浏览次数] 290 展会上,一个和真人一样大小的虚拟导游在为游客讲解,“他”的影像浮现在空气中,不需要在屏幕上成像……这…...