Day28 第八章 贪心算法 part01

server/2025/2/26 23:16:07/

一. 学习文章及资料

  • 理论基础
  • 455.分发饼干
  • 376.摆动序列
  • 53.最大子序和

二. 学习内容

1. 理论基础

算法>贪心算法无规律!

一般如想到局部最优,好像能推出全局最优,并且无明显反例,那就试一试!

2. 分发饼干

(1) 解题思路:

使用贪心策略,先将饼干数组和小孩数组排序。然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量。

                           

(2) 解题步骤:

class Solution {public int findContentChildren(int[] g, int[] s) {Arrays.sort(g);Arrays.sort(s);int result=0;int index=s.length-1;for(int i=g.length-1;i>=0;i--){if(index>=0&&s[index]>=g[i]){result++;index--;}}return result;}
}

3. 摆动序列

(1) 解题思路:
局部最优:删除单调坡度上的节点(不包括单调坡度两端的节点),那么这个坡度就可以有两个局部峰值。
全局最优:整个序列有最多的局部峰值,从而达到最长摆动序列。
实际操作上,只需统计数组的峰值数量就可以了(相当于是删除单一坡度上的节点,然后统计长度)

  • 情况一:上下坡中有平坡

  • 情况二:数组首尾两端

如只有两个不同数字,那默认最右边有峰值。如 [2,5], result 初始为 1(默认最右面有一个峰值),i为0,指向2,此时 curDiff > 0 && preDiff <= 0,那么 result++(计算了左面的峰值),最后得到的 result 就是 2(峰值个数为 2 即摆动序列长度为 2)

  • 情况三:单调坡中有平坡

在这个坡度摆动变化的时候,更新 preDiff 就行,这样 preDiff 在 单调区间有平坡的时候就不会发生变化,造成我们的误判。

class Solution {public int wiggleMaxLength(int[] nums) {if(nums.length<=1) return nums.length;int perDiff=0;//前一对差值int curDiff=0;//现一对差值int result=1; //记录峰值个数,序列默认序列最右边有一个峰值for(int i=0;i<nums.length-1;i++){//只遍历到倒数第二个,因为默认序列最右边有一个峰值curDiff=nums[i+1]-nums[i];//出现峰值if(perDiff>=0&&curDiff<0||perDiff<=0&&curDiff>0){result++;perDiff=curDiff;//注意这里,只在摆动变化的时候更新prediff}}return result;}
}

4. 最大子序和

(1) 解题思路:

局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。
全局最优:选取最大“连续和”
局部最优的情况下,并记录最大的“连续和”,可以推出全局最优

                       

class Solution {public int maxSubArray(int[] nums) {int result=Integer.MIN_VALUE;int sum=0;for(int i=0;i<nums.length;i++){sum+=nums[i];if(sum>result) result=sum;//取区间累计的最大值(相当于不断确定最大子序终止位置)if(sum<0) sum=0; //相当于重置最大子序起始位置,因为遇到负数一定是拉低总和}return result;}
}


http://www.ppmy.cn/server/170873.html

相关文章

从零开始开发纯血鸿蒙应用之网页浏览

从零开始开发纯血鸿蒙应用 〇、前言一、优化菜单交互1、BuilderFunction.ets2、改造 PageTitleBar 二、网址打开1、方式选择1、使用浏览器打开2、内部打开2.1、声明权限2.2、封装 WebViewPage2.2.1、组件字段2.2.2、aboutToAppear2.2.3、onBackPress2.2.4、标题栏2.2.4、网页内…

c/c++蓝桥杯经典编程题100道(22)最短路径问题

最短路径问题 ->返回c/c蓝桥杯经典编程题100道-目录 目录 最短路径问题 一、题型解释 二、例题问题描述 三、C语言实现 解法1&#xff1a;Dijkstra算法&#xff08;正权图&#xff0c;难度★★&#xff09; 解法2&#xff1a;Bellman-Ford算法&#xff08;含负权边&a…

【数据挖掘】数据仓库

数据仓库 目录&#xff1a;数据仓库相关知识点笔记4.2 数据仓库建模&#xff1a;数据立方体与 OLAP4.2.1 数据立方体&#xff1a;一种多维数据模型4.2.2 星形、雪花形和事实星座&#xff1a;多维数据模型的模式4.2.3 维&#xff1a;概念分层的作用4.2.4 度量的分类和计算4.2.5 …

深度学习之特征提取

前言 深度学习就是把输入转换成一个高维的向量&#xff0c;之后利用这个向量去完成分类、回归等任务。 深度学习特征工程知识图谱 1. 特征提取的本质 核心目标&#xff1a;将原始数据→高维语义特征向量 监督驱动&#xff1a;标签决定特征提取方向 典型架构&#xff1a; …

matlab 海浪模型和舰艇动力学模型

1、内容简介 matlab148-海浪模型和舰艇动力学模型 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略

墨刀列表突然变得很小怎么办?

换个浏览器就好了 或者调整原浏览器比例

ubuntu 安全策略(等保)

windows 三个帐号屏保设置组策略,密码超时次数/审计记录&#xff1b; linux 应具有登录失败处理功能&#xff0c;应配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等相关措施。 1、在系统中新建测试用户&#xff0c;使用此用户登录时多次输入错误密码&…

vue3 -- 中实现子组件与父组件的双向数据绑定

前言 在 Vue3 中实现子组件与父组件的双向数据绑定,v-model 是最核心的机制。以下是基于最新实践的完整实现方案和技术解析(结合 Vue3.3+ 新特性): 一、使用 defineModel 宏(推荐方案) 1. 基础实现 子组件: <script setup> // 声明一个名为 modelValue 的双向绑…