当前位置: 首页 > news >正文

【算法训练营Day23】贪心算法part1

文章目录

  • 理论基础
  • 分发饼干
  • 摆动序列
  • 最大子数组和

理论基础

贪心的本质是一种思想:选择每一阶段的局部最优,从而达到全局最优。

贪心的使用场景:一道题目要证明能使用贪心算法那就要涉及到庞杂的数学证明。一般不会这么去实践。在实际刷题或者面试的时候,手动模拟一下感觉可以局部最优推出整体最优,而且想不到明显反例,那么就试一试贪心。

贪心的解题套路与模板:不像二叉树、回溯算法没有那么具体的解题套路和模板。

分发饼干

题目链接:455. 分发饼干

解题逻辑:

本题要达到的局部的最优就是让每个孩子得到最小尺寸且满足胃口的饼干,这样从全局来说能满足更多的孩子。

解题代码如下:

class Solution {public int findContentChildren(int[] g, int[] s) {Arrays.sort(s);int count = 0;int[] record = new int[s.length];for(int i = 0;i < g.length;i++) {int need = g[i];for(int j = 0;j <s.length;j++) {int support = s[j];if(support >= need && record[j] == 0) {count++;record[j] = 1;break;}}}return count;}
}

这种算法就是先将饼干尺寸排个序,使用嵌套for循环根据孩子的胃口去匹配最小符合要求的饼干。这个方法的效率不高,可以使用双指针法进行升级:

class Solution {public int findContentChildren(int[] g, int[] s) {Arrays.sort(s);Arrays.sort(g);int count = 0;int need = 0;int support = 0;while(need < g.length && support < s.length) {if(g[need] <= s[support]) {count++;need++;support++;continue;}support++;}return count;}
}

摆动序列

题目链接:376. 摆动序列

首先我们约定:

  • nums[i] - nums[i - 1] > 0 表示上升
  • nums[i] - nums[i - 1] < 0 表示下降
  • nums[i] - nums[i - 1] = 0 表示平坡

贪心思想:我们要想摆动序列尽量地长,那么就要交错的选择上升以及下坡。

我们首先可以定义两个变量:

  • up:表示末尾向上摆动的序列最长长度,初始值为1
  • down:表示末尾向下摆动的序列最长长度,初始值为1

从索引1开始遍历数组,如果上升则up = down + 1,如果是下降的则down = up + 1。平坡不影响两种摆动序列的最长长度。最后up 和 down 中较大的那个就为摆动序列的最长子序列的长度

代码如下:

class Solution {public int wiggleMaxLength(int[] nums) {if(nums.length < 2) return 1; int up = 1;int down = 1;for(int i = 1; i < nums.length; i++){up = nums[i] > nums[i - 1] ? down + 1 : up;down = nums[i] < nums[i - 1] ? up + 1 : down;}return Math.max(up, down);}
}

最大子数组和

题目链接:53. 最大子数组和

方法1:暴力

双层for循环嵌套

方法2:回溯算法

获取该数组的所有组合,然后和最大的就行。不过这种暴力解法很耗时,在leetcode中ac不了

方法3:贪心算法

这一题如果使用贪心算法,那么局部最优就是:保证当前的连续和为正数,这样才能对后续添加的元素产生增加作用,如果当前和为负数,那么就从下一个元素重新计算连续和。一次可以推出全局最优。

代码如下:

class Solution {public int maxSubArray(int[] nums) {int sum = 0;int maxSum = Integer.MIN_VALUE;for(int i = 0;i < nums.length;i++){if(sum < 0) sum = 0;sum += nums[i];if(sum > maxSum) maxSum = sum;}return maxSum;}
}
http://www.lryc.cn/news/617383.html

相关文章:

  • InfluxDB 在物联网设备数据采集与分析中的应用(二)
  • Apache Ignite超时管理核心组件解析
  • 元数据管理与数据治理平台:Apache Atlas 基本搜索 Basic Search
  • 强化学习常用数据集
  • linux 秒 安装谷歌浏览器 区分ubuntu和centos 给python爬取网站使用
  • 提升行车安全的关键技术:BSD(盲点监测)与DSM(驾驶员监测)是如何工作的?
  • 剧本杀小程序系统开发:推动行业数字化转型新动力
  • 【VS Code - Qt】如何基于Docker Linux配置Windows10下的VS Code,开发调试ARM 版的Qt应用程序?
  • AI模型服务接入WAF防火墙
  • 为什么Open WebUI可以不联网问问题,而直接使用Ollama可能需要联网
  • 虚幻GAS底层原理解剖十 (网络)
  • Linux操作系统从入门到实战(二十)进程优先级
  • 汉森(1982)提出的广义矩估计法
  • ResponseBodyAdvice是什么?
  • Agent用户体验设计:人机交互的最佳实践
  • Cobalt Strike的简单搭建与使用
  • ARM基础概念 day51
  • 环境配置-拉取NVIDIA Docker镜像时出现401Unauthorized错误
  • Redis 01 数据结构
  • 第7节 大模型性能评估与优化方法指南
  • Web 开发前端与后端 API 的交互
  • 101. 孤岛的总面积
  • 区块链技术原理(5)-网络
  • 《深度解构:React与Redux构建复杂表单的底层逻辑与实践》
  • (附源码)基于Spring Boot的4S店信息管理系统 的设计与实现
  • 虚拟财产刑事辩护:跨地域性与匿名性带来的挑战
  • 【C/C++】(struct test*)0->b 讲解
  • 从零开始的ReAct Agent尝试
  • HTTPS应用层协议-中间攻击人
  • SharePlay确保最佳游戏体验