代码随想录算法训练营第27天|455. 分发饼干、376. 摆动序列、53. 最大子数组和

news2024/11/25 16:33:38

目录

  • 455. 分发饼干(总出问题,需要多次写)
    • 1、题目描述
    • 2、思路
    • 3、code
    • 4、复杂度分析
    • 5、超级无敌一句话总结
  • 376. 摆动序列
    • 1、题目描述
    • 2、思路
    • 4、复杂度分析
  • 53. 最大子数组和
    • 1、题目描述
    • 2、思路
    • 3、code
    • 4、复杂度分析

455. 分发饼干(总出问题,需要多次写)

题目链接:link

1、题目描述

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是满足尽可能多的孩子,并输出这个最大数值。

示例 1:
输入: g = [1,2,3], s = [1,1]
输出: 1
解释:
你有三个孩子和两块小饼干,3 个孩子的胃口值分别是:1,2,3。
虽然你有两块小饼干,由于他们的尺寸都是 1,你只能让胃口值是 1 的孩子满足。
所以你应该输出 1。

2、思路

🥵贪心思路:尽量用大饼干来喂大胃口的孩子
💔容易出错的地方: 到底要怎么转到下一个饼干或者下一个胃口(本人总是搞不明白)

饼干i = [3,2,1] 
胃口j = [6,2,1]
对于饼干3, 胃口6 不能满足 ➡️ 胃口+1
对于饼干3, 胃口2 能满足 ➡️ 饼干+1 胃口+1
对于饼干2, 胃口1 能满足 ➡️ 饼干+1 胃口+1
胃口个数到达最大值 🆗
# 对应代码
class Solution:
    def findContentChildren(self, g: List[int], s: List[int]) -> int:
        s.sort(reverse = True)
        g.sort(reverse = True)
        res = 0
        i = 0
        j = 0
        while (i<len(s)) and (j<len(g)):
            if s[i]<g[j]:
                j+=1
            else:
                i+=1
                j+=1
                res += 1
        return res

3、code

上一个思路的可以看出胃口是在每一轮都要到下一个的,因为不满足就说明最大的🍪都满足不了这个孩子的胃口;如果满足就说明这个孩子可以被喂饱,也要转到下一个孩子
所以可以遍历胃口,当🍪大于胃口的时候,转到下一个🍪(代码随想录的思路

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

4、复杂度分析

1️⃣ 时间复杂度: O ( N ) O(N) O(N)
2️⃣ 空间复杂度: O ( ! ) O(!) O(!)

5、超级无敌一句话总结

尽量用大饼干来喂大胃口的孩子,如果遍历思路不清晰,可以拿例子试一下,就知道什么时候该+1了

376. 摆动序列

题目链接:link

1、题目描述

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。
例如, [1, 7, 4, 9, 2, 5] 是一个 摆动序列 ,因为差值 (6, -3, 5, -7, 3) 是正负交替出现的。
相反,[1, 4, 7, 2, 5] 和 [1, 7, 4, 5, 5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。
子序列 可以通过从原始序列中删除一些(也可以不删除)元素来获得,剩下的元素保持其原始顺序。
给你一个整数数组 nums ,返回 nums 中作为 摆动序列 的 最长子序列的长度 。

2、思路

🤔摆动序列什么意思?
在这里插入图片描述
比如17这个点,前一个数为1,后一个数为5,17-1=16是正数,5-17=-12是负数,那么1,17,5就是一个摆动序列✅
比如10这个点,前一个数为5,后一个数为15,10-5 = 5是正数,15-5=5也为正数,那么5,10,15就不是一个摆动序列❌
所以就找到前后梯度相反的节点就是摆动序列,也就是说山区前后节点梯度相同的序列就是子摆动序列
🥵特殊情况:前一个梯度和后一个梯度为0,也就是平坡的情况

1️⃣ 超级无敌傻思路:先把数组中的平坡删掉

class Solution:
    def wiggleMaxLength(self, nums: List[int]) -> int:
        if len(nums) == 1:
            return 1
        # 先把平坡删掉
        new_nums = [nums[0]]
        pre = nums[0]
        for i in range(1,len(nums)):
            if nums[i] != pre:
                new_nums.append(nums[i])
                pre = nums[i]
        print(new_nums)
        # 单纯的找极值问题
        if len(new_nums) <= 2:
            return len(new_nums)
        res = 2
        prediff = new_nums[1] - new_nums[0]
        for i in range(1,len(new_nums)-1):
            curdiff = new_nums[i+1] - new_nums[i]
            # prediff = new_nums[i] - new_nums[i-1]
            if (curdiff > 0 and prediff < 0) or (curdiff < 0 and prediff > 0):
                res += 1
            prediff = curdiff
        return res

2️⃣ 把平坡当成特殊情况来考虑
平坡有两种情况:
🅰️情况一:上下坡中有平坡
在这里插入图片描述
这里面中间有4个2,我只想留下一个,同意规定就是留下最右边的2,可以看到这个2的点,前一个梯度为0,后一个梯度为-1,也就是说要把这种情况加到计算长度的情况里面:

if (curdiff > 0 and prediff <= 0) or (curdiff < 0 and prediff >= 0):
    res += 1

🅱️情况二:单调坡度有平坡
在这里插入图片描述

class Solution:
    def wiggleMaxLength(self, nums: List[int]) -> int:
        if len(nums) == 1:
            return 1
        pre = 0
        cur = 0
        res = 1 # 记录峰值个数,序列默认序列最右边有一个峰值
        for i in range(len(nums)-1):
            cur = nums[i+1] - nums[i]
            if (cur > 0 and pre <= 0) or (cur < 0 and pre >= 0):
                pre = cur
                res += 1
        return res

4、复杂度分析

1️⃣ 时间复杂度: O ( N ) O(N) O(N)
2️⃣ 空间复杂度: O ( 1 ) O(1) O(1)

53. 最大子数组和

题目链接:link

1、题目描述

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组是数组中的一个连续部分。

示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

2、思路

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

3、code

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        res = nums[0]
        max_res = res
        for i in range(1,len(nums)):
            if res<0:
                res = nums[i]
            else:
                res += nums[i]
            max_res = max(max_res,res)
        return max_res

4、复杂度分析

1️⃣ 时间复杂度: O ( N ) O(N) O(N)
2️⃣ 空间复杂度: O ( 1 ) O(1) O(1)

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

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

相关文章

无人机之伯努利定律

无人机的伯努利定律是解释无人机飞行原理的关键理论之一&#xff0c;它主要阐述了流体&#xff08;如空气&#xff09;在流动过程中速度与压力之间的关系。以下是对无人机伯努利定律的详细解释&#xff1a; 一、伯努利定律的基本原理 伯努利定律是流体力学中的一个基本原理&am…

初识时序数据库InfluxDB

最近项目开发中,需要记录时间序列的日志信息,InfluxDB 刚好契合。于是准备研究一下,发现已经有整理很好的文档,以下两篇觉得很好,入门开发可以参考一下。 因为项目是用C#开发的,因此,简单介绍一下C#开发中,InfluxDB的API使用。 1.简介 InfluxDB是一个由InfluxData开发…

18、Gemini-Pentest-v1

难度 中 &#xff08;个人认为是高&#xff09; 目标 root权限 一个flag 靶机启动环境为VMware kali 192.168.152.56 靶机 192.168.152.64 信息收集 突破点大概就是web端了 web测试 访问主页直接就是目录遍历 不过进去后是一个正常的网页 简单的试了几个弱口令无果继续信息…

什么是HTTPS协议?

HTTPS协议&#xff08;Hypertext Transfer Protocol Secure&#xff09;即安全超文本传输协议&#xff0c;是互联网上进行安全通信的一种重要协议。它是在HTTP&#xff08;Hypertext Transfer Protocol&#xff09;协议的基础上增加了安全性的要求&#xff0c;通过SSL&#xff…

ffmpeg面向对象-rtsp拉流相关对象

目录 1.AVFormatContext类。1.1 概述1.2 构造函数1.3 oopc的继承实现 2. AVInputFormat 类。2.1 多态的实现 3.所用设计模式3.1模板模式3.2 工厂模式&#xff1f; 3.3 rtsp拉流建链 4.this指针5.小结6.rtsp拉流流程 1.AVFormatContext类。 1.1 概述 用户看到的是AVFormatCont…

精益管理|Toyota Kata 是什么意思?

丰田套路是一种培养持续改进习惯的系统方法&#xff0c;也是精益管理&#xff08;CLMP&#xff09;中的一套方法。“Toyota Kata”一词来自精益专家 Mike Rother 的管理书籍《Toyota Kata&#xff1a;Managing People for Improvement, Adaptiveness, and Superior Results》。…

2024/9/11 小型PLC典型应用2:伺服canlink配置、指令、应用

下面这个指令需要设置伺服的急停方式&#xff08;例如&#xff1a;惯性停机、急停等等&#xff09; 通讯故障步骤排查 1&#xff1a;接线问题 2&#xff1a;配置问题&#xff08;波特率.....&#xff09;

安卓13允许app启动服务 android13允许应用启动服务 无法启动服务 Background start not allowed: service

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 android13应用启动服务,有些应用会被禁止启动服务,开启的服务会失败,这是高版本的android的特性,我们需要更改下frameworks的代码。 2.问题分析 查看下logcat信息 B…

百元榜哪个牌子的蓝牙耳机最好用?四大闭眼入高性价比耳机推荐!

蓝牙耳机的普及率在近年来越来越高&#xff0c;行业发展十分迅猛&#xff01;在很多好的品牌涌现的同时&#xff0c;也有很多的品牌质量不过关&#xff0c;货不对版&#xff0c;使得很多的人以为&#xff0c;百元的就没有好用蓝牙耳机&#xff0c;不少小伙伴在选择蓝牙耳机的时…

N-152基于java贪吃蛇游戏5

开发工具eclipse,jdk1.8 文档截图&#xff1a; N-152基于java贪吃蛇游戏5

抽象工厂模式abstract factory

此篇为学习笔记&#xff0c;原文链接 https://refactoringguru.cn/design-patterns/abstract-factory 它能创建一系列相关的对象&#xff0c; 而无需指定其具体类。抽象工厂提供了一个接口&#xff0c; 可用于创建每个系列产品的对象。 优点 你可以确保同一工厂生成的产品相…

2024/9/10黑马头条跟学笔记(六)

D6 1.今日学习内容 1.1需求分析 点击下架之后&#xff0c;app端显示以下架 耦合&#xff0c;没技术点&#xff0c;不用&#xff0c;咱用kafka&#xff0c;流量削峰&#xff0c;异步调用&#xff0c;解耦 为什么要学&#xff1f; 面时提问 2.kafka概述 rabbitMQ&#xff0c;…

C#基础:字段的初始化,特性,类的继承和多态基础demo

目录 一、字段 1.认识字段和属性 2.初始化字段 二、特性 1.特性的基础 2.特性的自定义和使用 三、继承 1.多继承 2.重写父类和增加子类方法 四、多态 一、字段 1.认识字段和属性 public class Test { public int field //我是字段public int property { get; set; …

建议AI大模型小白必看的学习教程!!

逼自己两周刷完 AI大模型(白嫖) LLM大模型自用资料&#xff0c;以及学习路线整理 整理了我入门大模型的学习路线和自用资料&#xff0c;在全民LLM时期&#xff0c;多输入一些就多一重安全感。建议先对LLM全貌有了解&#xff0c;然后自顶向下去学习。前置知识是nlp基础如transf…

Vue3.5正式上线,有哪些新特性和用法?

9月1日&#xff0c; Vue 3.5 正式发布了&#xff01; 此次要版本不包含重大更改&#xff0c;并且包括内部改进和有用的新功能。我们将在这篇博文中介绍一些亮点 - 有关更改和新功能的完整列表&#xff0c;请参阅 GitHub 上的完整更新日志。 1. Props 解构 在vue3.5 之前&#…

C语言14--作用域与存储期

作用域基本概念 C语言中&#xff0c;标识符都有一定的可见范围&#xff0c;这些可见范围保证了标识符只能在一个有限的区域内使用&#xff0c;这个可见范围&#xff0c;被称为作用域&#xff08;scope&#xff09;。 软件开发中&#xff0c;尽量缩小标识符的作用域是一项基本原…

细致刨析JDBC ③ 高级篇

目录 一、JDBC优化及工具类封装 1.现有问题 2.JDBC工具类封装V1.0 3.ThreadLocal 4.JDBC工具类封装V2.0 二、DAO封装及BaseDAO工具类 1.BaseDAO概念 2.BaseDao层代码实现 ① BaseDao层——通用的修改方法 ② 通用的查询方法 ③ 单行查询方法优化 三、事务 1、事务回顾 2.JDBC中…

批量操作Excel的四个方法(求和、移动、对比、合并)

Excel文件肯定少不了保存大量数据&#xff0c;那么在使用excel的时候会不会要大批量数据进行操作&#xff1f;今天分享4个快速使用excel操作的小技巧。希望能够帮大家提高excel制作效率。 技巧一&#xff1a;快速求和 当你想要分别得到行列的总和&#xff0c;我们可以选中表格…

WeChatFerry学习使用

准备 下载软件安装微信 安装python环境 conda create --prefixD:\PythonEnvs\wechatrobotstu python3.10 conda activate D:\PythonEnvs\wechatrobotstu使用 新建python项目 安装依赖包 pip install --upgrade wcferry -i https://pypi.doubanio.com/simple解压dll到一个…

安卓开发板_联发科MTK开发板使用ADB开发

1. ADB 使用 1.1. 前言 ADB&#xff0c;全称 Android Debug Bridge&#xff0c;是 Android 的命令行调试工具&#xff0c;可以完成多种功能&#xff0c;如跟踪系统日志&#xff0c;上传下载文件&#xff0c;安装应用等。 1.2. 准备连接 使用 adb时&#xff0c;你需要&#x…