算法训练第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
}
相关推荐
xiaoshiguang33 小时前
LeetCode:222.完全二叉树节点的数量
算法·leetcode
爱吃西瓜的小菜鸡3 小时前
【C语言】判断回文
c语言·学习·算法
别NULL3 小时前
机试题——疯长的草
数据结构·c++·算法
TT哇3 小时前
*【每日一题 提高题】[蓝桥杯 2022 国 A] 选素数
java·算法·蓝桥杯
yuanbenshidiaos5 小时前
C++----------函数的调用机制
java·c++·算法
唐叔在学习5 小时前
【唐叔学算法】第21天:超越比较-计数排序、桶排序与基数排序的Java实践及性能剖析
数据结构·算法·排序算法
ALISHENGYA5 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(switch语句)
数据结构·算法
chengooooooo5 小时前
代码随想录训练营第二十七天| 贪心理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和
算法·leetcode·职场和发展
jackiendsc5 小时前
Java的垃圾回收机制介绍、工作原理、算法及分析调优
java·开发语言·算法
游是水里的游7 小时前
【算法day20】回溯:子集与全排列问题
算法