算法训练第23天|455.分发饼干|376. 摆动序列|53. 最大子序和

LeetCode 455.分发饼干

题目链接:455.分发饼干

题目讲解:代码随想录

题目描述:假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。

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

思路:这里的局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩

可以尝试使用贪心策略,先将饼干数组和小孩数组排序。

然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量。

Go 复制代码
func findContentChildren(g []int, s []int) int {
    // 大饼干优先
    sort.Ints(g)
    sort.Ints(s)
    index := len(s) - 1
    result := 0
    for i := len(g) - 1; i >= 0; i--{
        if index >= 0 && s[index] >= g[i]{
            result++
            index--
        }
    }
    return result
}

LeetCode 376. 摆动序列

题目链接:376. 摆动序列

题目讲解:代码随想录

题目描述:如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。

思路:题目要求的是最长摆动子序列的长度,所以只需要统计数组的峰值数量就可以了。

本题要考虑三种情况:

  1. 情况一:上下坡中有平坡,例如 1,2,2,2,1这样的数组
  2. 情况二:数组首尾两端,如果只有两个不同的元素,那摆动序列也是 2。例如序列2,5,如果靠统计差值来计算峰值个数就需要考虑数组最左面和最右面的特殊情况。
  3. 情况三:单调坡中有平坡,如果在一个单调坡度上有平坡,例如1,2,2,2,3,4,我们只需要在 这个坡度摆动变化的时候,更新 prediff 就行,这样 prediff 在单调区间有平坡的时候就不会发生变化,造成我们的误判。
Go 复制代码
func wiggleMaxLength(nums []int) int {
    // 贪心
    n := len(nums)
    if n < 2{
        return n
    }

    ans := 1
    prevDiff := nums[1] - nums[0]
    if prevDiff != 0{
        ans = 2
    }

    for i := 2; i < n; i++{
        diff := nums[i] - nums[i-1]
        if diff > 0 && prevDiff <= 0 || diff < 0 && prevDiff >=0{
            ans++
            prevDiff = diff
        }
    }
    return ans
}

LeetCode 53. 最大子序和

题目链接:53. 最大子序和

题目讲解:代码随想录

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

思路:

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

全局最优:选取最大"连续和"

Go 复制代码
func maxSubArray(nums []int) int {
    // 贪心
    max := nums[0]
    count := 0
    for i := 0; i < len(nums); i++{
        count += nums[i]
        if count > max{
            max = count
        }
        if count < 0{
            count = 0
        }
    }
    return max
}
相关推荐
小雨下雨的雨3 小时前
井字棋AI机器人实现详解 - Minimax算法实战-鸿蒙PC Electron框架完成
前端·人工智能·算法·华为·electron·鸿蒙
xieliyu.5 小时前
Java算法精讲:双指针(三)
java·开发语言·算法
一条小锦吕*6 小时前
基于Spring Boot + 数据可视化 + 协同过滤算法的推荐系统设计与实现(源码+论文+部署全讲解)
spring boot·算法·信息可视化
如竟没有火炬7 小时前
最大矩阵——单调栈
数据结构·python·线性代数·算法·leetcode·矩阵
8Qi88 小时前
LeetCode 1143 & 718:最长公共子序列 / 最长重复子数组
算法·leetcode·职场和发展·动态规划
绿算技术8 小时前
万卡推理集群存储选型分析:从核心架构到应用视角
大数据·科技·算法·架构
想吃火锅10059 小时前
【leetcode】1.两数之和js版
javascript·算法·leetcode
net3m3310 小时前
一阶软件低通滤波器算法
人工智能·算法
水木流年追梦10 小时前
大模型入门-大模型优化方法12-YaRN 长文本外推技术
人工智能·分布式·算法·正则表达式·prompt