首页 > 编程语言 >代码随想录算法训练营-回溯算法|455. 分发饼干、376. 摆动序列

代码随想录算法训练营-回溯算法|455. 分发饼干、376. 摆动序列

时间:2023-09-16 10:33:06浏览次数:49  
标签:index 饼干 随想录 455 摆动 算法 result 序列 最优

1.贪心算法一般分为如下四步:

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

 455. 分发饼干

1. 局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩。

  • 时间复杂度:O(nlogn)
  • 空间复杂度:O(1)

2.  for 控制 胃口,里面的 if 控制饼干。

3. 技巧:用了一个 index 来控制饼干数组的遍历,遍历饼干并没有再起一个 for 循环,而是采用自减的方式。

 1 class Solution:
 2     def findContentChildren(self, g, s):
 3         g.sort()  # 将孩子的贪心因子排序
 4         s.sort()  # 将饼干的尺寸排序
 5         index = len(s) - 1  # 饼干数组的下标,从最后一个饼干开始
 6         result = 0  # 满足孩子的数量
 7         for i in range(len(g)-1, -1, -1):  # 遍历胃口,从最后一个孩子开始
 8             if index >= 0 and s[index] >= g[i]:  # 遍历饼干
 9                 result += 1
10                 index -= 1
11         return result

376. 摆动序列

1. 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。

2. 局部最优:删除单调坡度上的节点(不包括单调坡度两端的节点),那么这个坡度就可以有两个局部峰值。

3. 整体最优:整个序列有最多的局部峰值,从而达到最长摆动序列。

4. 只需要统计数组的峰值数量就可以了(相当于是删除单一坡度上的节点,然后统计长度)

本题要考虑三种情况:

  1. 情况一:上下坡中有平坡
  2. 情况二:数组首尾两端
  3. 情况三:单调坡中有平坡

5. 也可以用动态规划进行求解。

 1 class Solution:
 2     def wiggleMaxLength(self, nums):
 3         if len(nums) <= 1:
 4             return len(nums)  # 如果数组长度为0或1,则返回数组长度
 5         curDiff = 0  # 当前一对元素的差值
 6         preDiff = 0  # 前一对元素的差值
 7         result = 1  # 记录峰值的个数,初始为1(默认最右边的元素被视为峰值)
 8         for i in range(len(nums) - 1):
 9             curDiff = nums[i + 1] - nums[i]  # 计算下一个元素与当前元素的差值
10             # 如果遇到一个峰值
11             if (preDiff <= 0 and curDiff > 0) or (preDiff >= 0 and curDiff < 0):
12                 result += 1  # 峰值个数加1
13                 preDiff = curDiff  # 注意这里,只在摆动变化的时候更新preDiff
14         return result  # 返回最长摆动子序列的长度

 

标签:index,饼干,随想录,455,摆动,算法,result,序列,最优
From: https://www.cnblogs.com/wuyijia/p/17706295.html

相关文章

  • [代码随想录]Day46-动态规划part14
    题目:1143.最长公共子序列思路:主要就是两大情况:text1[i-1]与text2[j-1]相同,text1[i-1]与text2[j-1]不相同如果text1[i-1]与text2[j-1]相同,那么找到了一个公共元素,所以dp[i][j]=dp[i-1][j-1]+1;如果text1[i-1]与text2[j-1]不相同,那就看看......
  • m基于uw导频序列和cordic算法的基带数据帧频偏估计和补偿FPGA实现,包含testbench
    1.算法仿真效果本系统进行了Vivado2019.2平台的开发,测试结果如下:我们可以看到,带有频偏的基带信号o_I_fre和o_Q_fre得到了有效的频偏补偿,其补偿后的数据o_Ir和o_Qr和原始的基带数据基本一致。2.算法涉及理论知识概要基带数据帧频偏估计和补偿是一种用于纠正数字通信系统中......
  • 基于机器学习的情绪识别算法matlab仿真,对比SVM,LDA以及决策树
    1.算法理论概述      情绪识别是一种重要的情感分析任务,旨在从文本、语音或图像等数据中识别出人的情绪状态,如高兴、悲伤、愤怒等。本文介绍一种基于机器学习的情绪识别算法,使用三种常见的分类算法:支持向量机(SVM)、线性判别分析(LDA)和决策树,通过对比这三种算法在情绪识别任......
  • m基于uw导频序列和cordic算法的基带数据帧频偏估计和补偿FPGA实现,包含testbench
    1.算法仿真效果本系统进行了Vivado2019.2平台的开发,测试结果如下:          我们可以看到,带有频偏的基带信号o_I_fre和o_Q_fre得到了有效的频偏补偿,其补偿后的数据o_Ir和o_Qr和原始的基带数据基本一致。 2.算法涉及理论知识概要     基带数据帧频偏估计......
  • 代码随想录算法训练营第九天
    代码随想录算法训练营第九天|LeetCode232(用栈实现队列)LeetCode225(用队列实现栈)栈和队列理论基础定义栈(stack),一种遵循先进后出(FILO—First-In/Last-Out)原则的线性存储结构。队列(queue),一种遵循先进先出(FIFO—firstinfirstout)原则的线性存储结构栈方法方法名......
  • 深入了解堆排序算法
    堆排序(HeapSort)是一种高效的、基于堆数据结构的排序算法,它具有稳定性和可预测的性能,适用于各种数据规模。本文将详细介绍堆排序的工作原理,提供示例和Python、Go、Java以及C语言的实现代码。堆排序的基本思想堆排序的核心思想是通过构建一个二叉堆,将待排序的数组转换为一个堆,然后反......
  • 代码随想录算法训练营第10天| 232.用栈实现队列 ● 225. 用队列实现栈
    栈和队列232.用栈实现队列stack:queue:卡哥代码一个入栈,一个出栈,即可模拟队列的pop操作pop之前要检查出栈是否为空若为空,则排出入栈里所有的元素至出栈中classMyQueue{public:stack<int>stackIn;stack<int>stackOut;MyQueue(){......
  • 【算法进阶课】动态规划笔记
    基环树DP一些基本概念:在一棵树上加一条边,就会构成一个环,环上会挂着一些子树。基环树是只有一个环的仙人掌。如果基环树的边是有向边,环上的点是p1,p2,p3,...则环上的边是p1->p2,p2->p3,...,pn->p1或者全部反过来总之就是环上的边要么全部逆时针要么全部顺时针。对于......
  • 3 - 任务调度算法 & 同步与互斥 &队列
    之前的都是按照优先级不同允许抢占(不讲道理),不管你在做什么,轮到优先级最高的任务,直接抢占执行怎样才能讲道理呢?稍微等等嘛,等我做完活你再做 1支持抢占,0不支持抢占 同优先级任务是否交替执行,1交替0不交 空闲任务是否礼让其他任务礼让的话,自己的函数逻辑在时间片内只执行......
  • 【代码随想录算法训练营第二天】977.有序数组的平方、209.长度最小的子数组 、59.螺旋
    Day2-数组2023.9.15Leetcode977有序数组的平方给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。初解我还是不能想到暴力解法之外的,对某个问题的最优复杂度也没有概念。就算提示我是用指针,我也想不到思路。现在我知......