首页 > 编程语言 >代码随想录算法训练营第29天 | 贪心算法1:455.分发饼干、376.摆动序列、53.最大子序和

代码随想录算法训练营第29天 | 贪心算法1:455.分发饼干、376.摆动序列、53.最大子序和

时间:2024-07-19 10:54:04浏览次数:15  
标签:int res 随想录 st 算法 https 子序 贪心

代码随想录算法训练营第29天 | 贪心算法1:455.分发饼干、376.摆动序列、53.最大子序和

贪心算法基础理论
https://programmercarl.com/贪心算法理论基础.html
455.分发饼干
https://leetcode.cn/problems/assign-cookies/description/
代码随想录
https://programmercarl.com/0455.分发饼干.html
376.摆动序列
https://leetcode.cn/problems/wiggle-subsequence/
代码随想录
https://programmercarl.com/0376.摆动序列.html
53.最大子序和
https://leetcode.cn/problems/maximum-subarray/description/
代码随想录
https://programmercarl.com/0053.最大子序和.html#算法公开课

贪心算法理论基础

分类

  • 简单题目
    • 455:分发饼干
    • 1005:K次取反后最大化数组和
    • 860:柠檬水找零
  • 中等题目
    • 序列问题
    • 贪心解决股票问题
      • 122.买卖股票的最佳时机
      • 714。买卖股票的最佳时机+手续费
    • 两个维度权衡问题
      • 135:分发糖果
      • 406:身高重建队列
  • 有点难度
    • 区间问题
      • 55 跳跃游戏
      • 45 跳跃游戏2
      • 452 最少数量的箭引爆气球
      • 435 无重叠区间
      • 763 划分字母区间
      • 56 合并区间
    • 53.最大子序列和
    • 134.加油站
    • 968.监控二叉树

核心思想

  • 每个阶段的局部最优——>全局最优

解题步骤

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

455.分发饼干

题解思路

  • 方法一:从小开始比较
  • 方法二:从大开始比较
  • 直接用栈模拟场景

题解代码

## 
class Solution:
    def findContentChildren(self, g: List[int], s: List[int]) -> int:
        g_st = sorted(g)
        s_st = sorted(s)
        res = 0
        for i in range(len(s_st)):
            if res<len(g) and s_st[i]>=g_st[res]:
                res = res+1
        return res
## 栈模拟
class Solution:
    def findContentChildren(self, g: List[int], s: List[int]) -> int:
        g_st = sorted(g)
        s_st = sorted(s)
        res = 0
        while s_st and g_st:
            chil = g_st.pop()
            cookie = s_st.pop()
            if cookie>=chil:
                res = res+1
            else:
                s_st.append(cookie)
        return res

376. 摆动序列

题解思路

  • 2种特殊情况
    1. 出现平坡不改变方向
    2. 出现平坡但改变方向
  • 双指针/列表存储diff

题解代码

## 双指针
class Solution:
    def wiggleMaxLength(self, nums: List[int]) -> int:
        pre_diff,curr_diff,res = 0,0,0
        for i in range(1,len(nums)):
            curr_diff = nums[i]-nums[i-1]
            if curr_diff*pre_diff<=0 and curr_diff!=0:
                res = res+1
                pre_diff = curr_diff
        return res+1

53. 最大子序和

题解思路

  • 如果前面的数字之和小于0 就归0 已经不是最大和
  • 考虑合适将sum赋值到res中

题解代码

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        res = -float('inf')
        sum_ = 0 
        for i in range(len(nums)):
            sum_ = sum_+nums[i] ##先赋值 不满足就归零了 
            res = max(sum_,res)
            if sum_<=0:
                sum_ = 0
        return res

标签:int,res,随想录,st,算法,https,子序,贪心
From: https://www.cnblogs.com/P201821440041/p/18310408

相关文章

  • 算法篇 滑动窗口 leetCode 水果成篮
    水果成蓝1.题目描述2.图形分析2.1原理解释2.2怎么想出使用滑动窗口2.3图形分析3.代码演示1.题目描述2.图形分析2.1原理解释2.2怎么想出使用滑动窗口2.3图形分析3.代码演示......
  • 【算法设计与分析】期末考试复习 - 基础知识(基础知识超详细)
    文章目录前言引言问题问题描述实例目标数学表达步骤示例伪代码解释1.问题的复杂度冒泡排序笔记选择排序笔记插入排序笔记归并排序笔记快速排序笔记一些问题哪个排序算法效率最高?是否可以找到更好的排序算法?排序问题计算难度如何?其他排序算法的复杂度问题计算复杂度估......
  • 计算机毕业设计Python+Tensorflow小说推荐系统 K-means聚类推荐算法 深度学习 Kears
    2、基于物品协同过滤推荐算法2.1、基于⽤户的协同过滤算法(UserCF)该算法利⽤⽤户之间的相似性来推荐⽤户感兴趣的信息,个⼈通过合作的机制给予信息相当程度的回应(如评分)并记录下来以达到过滤的⽬的进⽽帮助别⼈筛选信息,回应不⼀定局限于特别感兴趣的,特别不感兴趣信息的纪录也相......
  • 【笔记】辛普森算法
    核心思想是将被积区间分为若干小段,每段套用二次函数的积分公式进行计算。具体而言,对于一个二次函数\(f(x)\),有:\[\int_{l}^{r}f(x)\mathrm{d}x=\frac{(r-l)\left(f(l)+f(r)+4f\left(\frac{l+r}{2}\right)\right)}{6}\]1普通辛普森直接分成若干段来计算。2自适应辛普森......
  • Vue2中Diff算法解析
    Vue2中Diff算法解析import{compileToFunction}from'./compiler/index.js';import{patch,createElm}from'./vdom/patch';//1.创建第一个虚拟节点letvm1=newVue({data:{name:'hs'}});letrender1=compileToFunction('<div>{{nam......
  • [深入理解Java虚拟机]Hotspot垃圾回收算法
    HotSpot的算法细节实现3.2、3.3节从理论原理上介绍了常见的对象存活判定算法和垃圾收集算法,Java虚拟机实现这些算法时,必须对算法的执行效率有严格的考量,才能保证虚拟机高效运行。本章设置这部分内容主要是为了稍后介绍各款垃圾收集器时做前置知识铺垫,如果读者对这部分内容感到枯......
  • 代码随想录day 29 买卖股票的最佳时机II | 跳跃游戏 | 跳跃游戏II | K次取反后最大化
    买卖股票的最佳时机II买卖股票的最佳时机II解题思路利用贪心算法,只要股票卖了后一天能获利,就买了,所以只要遍历一下整个数组,根据这个算法就能得到最终获利的数目知识点贪心心得歪打正着的一题跳跃游戏跳跃游戏解题思路利用贪心算法,只需要有一次跳转到数组之外说明就能跳......
  • VUE diff 算法:为了直观展示,画了一张图来直观展示
      上图直观展示了Vue的Diff算法流程:3种方式比较根节点:图中左侧的"OldVNode"和右侧的"NewVNode"表示旧的和新的虚拟DOM根节点。箭头表示比较过程,如果根节点不同,直接替换整个节点。比较子节点:当根节点相同时,递归比较子节点。左侧"OldChild1"和"O......
  • 算法竞赛复健记录
    高三学了一年文化课感觉已经不会算法竞赛了,开个博客记录一下复健历程。CF1662F题意:有\(n\le200000\)个点,每个点有能量\(p_i\),消息能从\(i\)传到\(j\)当且仅当\(|i-j|\le\min(p_i,p_j)\),求消息从\(a\)点传到\(b\)点至少需要经过几个点。考虑把点按\(p_i\)......
  • 代码随想录day28 分发饼干 | 摆动序列 | 最大子序和
    分发饼干分发饼干解题思路用贪心算法,胃口最大的孩子就需要尺寸最大的饼干,如果没有符合条件的饼干则换胃口第二大的孩子,以此类推。局部最优就是全局最优。知识点贪心心得简单摆动序列摆动序列解题思路通过遍历整个数组找到峰值,峰值则是找到最长的子序列,局部最优就是全......