代码随想录学习Day 27

贪心算法理论基础

贪心的本质:通过每一阶段的局部最优推出全局最优。

思路:找局部最优,看能不能推出全局最优,并尝试举反例。

步骤:

  • 将问题分解为若干个子问题
  • 找出适合的贪心策略
  • 求解每一个子问题的最优解
  • 将局部最优解堆叠成全局最优

455.分发饼干

题目链接

讲解链接

首先想到的解法是先将s数组和g数组按照从小到大的顺序排序,然后用两个for循环来遍历两个数组,外层遍历g数组,内层遍历s数组,每次遇到满足g[i] < s[i]的情况时就将result+1,然后将s[i]置零代表这篇饼干已被使用过,并跳出当前层循环;若不满足则直接continue,查找下一片饼干。总体思路就是优先满足胃口小的孩子。

class Solution:def findContentChildren(self, g: List[int], s: List[int]) -> int:s.sort()  # 排序,从小到大g.sort()  # 使小胃口的孩子和小饼干排列在前result = 0  # 结果初始为0for i in range(len(g)):  # 遍历孩子数组for j in range(len(s)):  # 遍历饼干数组if g[i] > s[j]:  # 意味着饼干不能满足孩子胃口,直接跳过,寻找下一块饼干continueelse:s[j] = 0  # 满足条件则将当前饼干置零,防止后续再被使用result += 1breakreturn result

优化版本,不需要使用两个for循环,降低时间复杂度:

class Solution:def findContentChildren(self, g: List[int], s: List[int]) -> int:s.sort()g.sort()index = 0  # 用一个index来遍历胃口for i in range(len(s)):  # for循环遍历饼干if index < len(g) and g[index] <= s[i]:  # 仅当满足条件时,index才会+1index += 1return index  # 返回index,也就是消耗的饼干数

这里必须外层遍历饼干,内层遍历胃口才可以,因为外层循环的i是固定移动的,内层的index只有在满足条件时才会移动,如果交换顺序就会导致一直在用最小的饼干来对比所有孩子的胃口,从而无法得出结果。

376.摆动序列

题目链接

讲解链接

思路:局部最优——删除单调坡度上的节点(不包括单调坡度两端的节点),那么这个坡度就可以有两个局部峰值整体最优——整个序列有最多的局部峰值,从而达到最长摆动序列

实际上不需要进行删除操作,因为题目要求的是最长摆动子序列的长度,所以只需要统计数组的峰值数量就可以了(相当于是删除单一坡度上的节点,然后统计长度)。如果前一对差值prediff与当前对差值curdiff的乘积小于0,那么就说明当前是一处摆动。代码如下:

class Solution:def wiggleMaxLength(self, nums: List[int]) -> int:if len(nums) <= 1:  # 如果数组长度小于等于1,那么则直接返回数组的长度return len(nums)prediff, curdiff, result = 0, 0, 1  # 初始化前一对差值,当前差值和结果,因为输出的结果是序列的长度,所以结果的初值要设置为1(单纯计算正负差值的对数的结果与序列长度相差1)for i in range(1, len(nums)):  # 遍历数组,从1开始curdiff = nums[i] - nums[i - 1]  # 计算当前差值if curdiff * prediff <= 0 and curdiff != 0:  # 若当前差与前一对差乘起来的结果是负数或0,且当前差值不为0,那么说明出现了摆动result += 1  # 结果+1prediff = curdiff  # 只有出现摆动时才令前一对差等于当前差return result

53.最大子数组和

题目链接

讲解链接

暴力解法,容易想到但会超时。

class Solution:def maxSubArray(self, nums: List[int]) -> int:result = float('-inf')  # 结果初始为无穷小for i in range(len(nums)):  # i对应遍历的起始位置sum = 0  # 每次改变起始位置时都将sum置零for j in range(i, len(nums)):  # 每次从j从i开始遍历寻找最大值sum += nums[j]if sum > result:  # 如果sum大于之前的result,就进行赋值result = sumreturn result

贪心思路:

局部最优——当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。全局最优——选取最大“连续和”

遍历 nums,从头开始用sum累积,如果sum一旦加上nums[i]变为负数,那么就应该从 nums[i+1]开始从 0 累积sum了,因为已经变为负数的sum,只会拖累总和。

这相当于是暴力解法中的不断调整最大子序和区间的起始位置

class Solution:def maxSubArray(self, nums: List[int]) -> int:result = float('-inf')  # result初始为无穷小sum = 0  # 连续和初始为0for i in range(len(nums)):  # 遍历数组sum += nums[i]  # 将第i个元素加到连续和上if sum > result:  # 如果当前连续和大于result,则更新result的值result = sumif sum < 0:  # 如果连续和小于0,则直接舍弃sum = 0  # 将连续和置零continue  # 从下一个i开始重新计算,类似于暴力法的移动起始位置return result

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

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

相关文章

TDengine taosAdapter启用HTTPS

HTTPS &#xff08;Hypertext Transfer Protocol Secure &#xff09;&#xff0c;是以安全为目标的 HTTP 通道&#xff0c;在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 。HTTPS 在HTTP 的基础下加入SSL&#xff0c;HTTPS 的安全基础是 SSL&#xff0c;因此加…

JDK、JRE 及 JVM 是什么?

一、JDK 是什么&#xff1f;有哪些内容组成&#xff1f; JDK 是 Java 开发工具包&#xff0c;包含 JVM 虚拟机&#xff08;Java 程序运行的地方&#xff09;、核心类库&#xff08;Java已经写好的东西&#xff0c;我们可以直接用&#xff09;、开发工具&#xff08;javac、jav…

算法打卡day45|动态规划篇13| Leetcode 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

算法题 Leetcode 300.最长递增子序列 题目链接:300.最长递增子序列 大佬视频讲解&#xff1a;300.最长递增子序列视频讲解 个人思路 没什么思路,菜就多练! 解法 动态规划 “子序列是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而…

Razzashi Raptor

拉扎什迅猛龙 Razzashi Raptor 95000金&#xff08;游戏币&#xff09;比老虎便宜多了&#xff0c;捡漏啊 为啥我开团都不出&#xff0c;很生气&#xff0c;去打架&#xff01;&#xff01;

python-pytorch实现lstm模型预测文本输出0.1.00

python-pytorch实现lstm模型预测文本输出0.1.00 数据参考效果分词到数组准备数数据查看频次获取vacab生成输入数据训练测试连续预测 有问题还需要完善 数据 一篇新闻&#xff1a;https://news.sina.com.cn/c/2024-04-12/doc-inarqiev0222543.shtml 参考 https://blog.csdn.…

ArcGIS Desktop使用入门(三)图层右键工具——标注要素、将标注转换为注记

系列文章目录 ArcGIS Desktop使用入门&#xff08;一&#xff09;软件初认识 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——标准工具 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——编辑器 ArcGIS Desktop使用入门&#xff08;二&#x…

零基础突破:开启你的IT行业之旅

零基础突破&#xff1a;开启你的IT行业之旅 在信息技术不断演进的今天&#xff0c;IT行业已成为众多职场人士和新手梦寐以求的领域。但对于那些没有任何相关背景知识的人来说&#xff0c;进入这一行业似乎是一条充满挑战的道路。然而&#xff0c;通过采取正确的方法和技巧&…

【Godot4自学手册】第三十六节圆形移动或扇形移动的铁球

在第三十四节我实现了来回无限滚动的伤害铁刺球&#xff0c;这一节我准备实现一个圆形移动或扇形移动&#xff0c;并带有链条的铁球。效果如下&#xff1a; 一、实现原理 绕一点做圆周运动&#xff0c;简单的说就是&#xff1a; 每一帧根据旋转的角度计算出下一个位置的坐标…

Redis--16--Spring Data Redis

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Spring Data Redishttps://spring.io/projects/spring-data-redis 1.依赖2.RedisTemplate3.案例 序列化1.默认是 JdkSerializationRedisSerializer2.添加Redis配置文…

第十二章 OpenGL ES 基础-色温、色调、亮度、对比度、饱和度、高光

第十二章 OpenGL ES 基础-色温、色调、亮度、对比度、饱和度、高光 第一章 OpenGL ES 基础-屏幕、纹理、顶点坐标 第二章 OpenGL ES 基础-GLSL语法简单总结 第三章 OpenGL ES 基础-GLSL渲染纹理 第四章 OpenGL ES 基础-位移、缩放、旋转原理 第五章 OpenGL ES 基础-透视投影…

关于阿里云centos系统下宝塔面板部署django/中pip install mysqlclient失败问题的大总结/阿里云使用oss长期访问凭证

python版本3.12.0 项目的版本依赖 问题1 解决方案 sudo vim /etc/profile export MYSQLCLIENT_CFLAGS"-I/usr/include/mysql" export MYSQLCLIENT_LDFLAGS"-L/usr/lib64/mysql" Esc退出编辑模式 &#xff1a;wq退出并且保存 问题二 说是找不到 mysql.h头…

Html网页小游戏源代码

Html网页小游戏源代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Jello Jumping Game</title><meta name"viewport" content"widthdevice-width, initial-scale1"&…

[蓝桥杯] 岛屿个数(C语言)

提示&#xff1a; 橙色字体为需要注意部分&#xff0c;红色字体为难点部分&#xff0c;会在文章“重难点解答”部分精讲。 题目链接 蓝桥杯2023年第十四届省赛真题-岛屿个数 - C语言网 题目理解 这道题让我们求岛屿个数&#xff0c;那么我们就应该先弄懂&#xff0c;对于一…

基于小程序实现的医院预约挂号系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

prometheus\skywalking\splunk功能的区别

Prometheus、SkyWalking和Splunk这三个工具在功能上各有特色&#xff0c;以下是它们各自的主要功能特点&#xff1a; Prometheus是一个开源的系统监控和警报工具。它的主要功能包括&#xff1a; 实时监控与警报&#xff1a;Prometheus可以实时监控各种指标&#xff0c;并根据…

ThreadLocal详细解释

ThreadLocal ThreadLocal是Java提供的一个线程级别的变量&#xff0c;是一个线程本地存储的工具类。它可以用来保存当前线程的局部变量&#xff0c;这些变量只在当前线程内可见&#xff0c;对其他线程是不可见的。通过ThreadLocal可以实现线程间数据的隔离&#xff0c;每个线程…

如何访问远程MySQL数据库?

远程访问MySQL数据库是在不同设备之间实现数据交互的一种方式。通过远程访问&#xff0c;用户可以轻松地操作远程MySQL数据库&#xff0c;从而实现数据的读写、修改和查询等操作。本文将介绍远程访问MySQL数据库的原理和实现方法&#xff0c;以及一种被广泛应用的解决方案【天联…

MyBatis 中的动态 SQL 的相关使用方法

为什么会有动态SQL&#xff0c;把SQL写死不是比较方便吗&#xff1f;其实有很多的举例&#xff0c;这里我那一个常见的来说&#xff0c;像我们用户注册&#xff0c;会有必填字段和非必填字段&#xff0c;有些传来的参数不一样&#xff0c;那对应的SQL也不一样&#xff0c;因此&…

FluentUI系列 - 1 - 介绍第一个窗口

介绍一个QML的UI库&#xff0c;国人编写&#xff0c;作者也耍知乎。这个UI库确实好用&#xff0c;但是教程基本等于无&#xff0c;个人在使用中顺便记录一下学习内容。这玩意儿也有Pyside6的版本&#xff0c;有需要的可以查看PySide6-FluentUI-QML。 FluentUI库地址​github.c…

【MVCC】深入浅出彻底理解MVCC

MVCC概述 MVCC&#xff08;Multi-Version Concurrency Control&#xff09;即多版本并发控制。主要是为了提高数据库的并发性能而提供的&#xff0c;采用了不加锁的方式处理读-写并发冲突&#xff0c;确保了任何时刻的读操作都是非阻塞的。只需要很小的开销&#xff0c;就可以…