算法训练营day31

一、贪心算法理论基础

在问题的每个决策阶段,都选择当前看起来最优的选择,即贪心地做出局部最优的决策,以期获得全局最优解。

最好用的策略就是举反例,如果想不到反例,那么就试一试贪心吧

动态规划和贪心的区别

  • 动态规划会根据之前阶段的所有决策来考虑当前决策,并使用过去子问题的解来构建当前子问题的解。
  • 贪心算法不会考虑过去的决策,而是一路向前地进行贪心选择,不断缩小问题范围,直至问题被解决。
二、分发饼干
class Solution {public int findContentChildren(int[] g, int[] s) {//先排序,形成升序数组Arrays.sort(g);Arrays.sort(s);int m = g.length, n = s.length;int count = 0;for(int i = 0, j = 0; i < m && j < n; i++,j++){//当前饼干无法满足孩子胃口,饼干大小递增while(j < n && g[i] > s[j]){j++;}// g[i] <= s[j]表示饼干能满足孩子胃口if(j < n){count++;}}return count;}
}
三、摆动序列

在循环遍历数组nums的过程中,我们通过比较当前数字和前一个数字的大小关系,来确定当前位置是上升摆动还是下降摆动。

  • 如果当前数字大于前一个数字,说明出现了上升摆动。我们更新up的值为down + 1,表示当前位置上升摆动序列的最大长度(因为上升摆动的前一个数字应该是下降摆动序列的最大长度)。
  • 如果当前数字小于前一个数字,说明出现了下降摆动。我们更新down的值为up + 1,表示当前位置下降摆动序列的最大长度(因为下降摆动的前一个数字应该是上升摆动序列的最大长度)。

通过不断更新updown,我们可以找到整个数字序列中的最长摆动子序列的长度。

最后,返回downup中的最大值,即为最长摆动子序列的长度。

ps,这里的上升和下降其实针对的是序列的尾部两个元素来说的,之前的元素一定都是摆动的序列

class Solution {public int wiggleMaxLength(int[] nums) {
//up 和 down 初始化为1,因为一旦找到上升或下降序列,一定是两个元素,+1刚好为2int down = 1, up = 1;
//for (int i = 1; i < nums.length; i++) {if (nums[i] > nums[i - 1])up = down + 1;else if (nums[i] < nums[i - 1])down = up + 1;}return nums.length == 0 ? 0 : Math.max(down, up);}
}
四、最大子序和
public class Solution {public int maxSubArray(int[] nums) {int len = nums.length;
// 1.dp[i] (对应子问题的解) 表示:以 nums[i] 结尾的连续子数组的最大和int[] dp = new int[len];dp[0] = nums[0]; //2.初始状态for (int i = 1; i < len; i++) {if (dp[i - 1] > 0) {dp[i] = dp[i - 1] + nums[i];//3.状态转移方程} else {dp[i] = nums[i];//3.状态转移方程}}// 也可以在上面遍历的同时求出 res 的最大值,这里我们为了语义清晰分开写,大家可以自行选择int res = dp[0];for (int i = 1; i < len; i++) {res = Math.max(res, dp[i]);}return res;}
}
五、零钱兑换(动态规划)

这个题在一定条件下可以使用贪心,但是全部情况的还是要用动态规划,做这个题体验动态规划和贪心算法的区别

只问最优值,没要求最优解,一般情况下可以使用动态规划解决

import java.util.Arrays;public class Solution {public int coinChange(int[] coins, int amount) {
// 给 0 占位,因为索引从0开始,所以dp[amount]对应长度为amount + 1
//用于存储凑齐每个金额所需的最少硬币数量int[] dp = new int[amount + 1];// 注意:因为要比较的是最小值,这个不可能的值就得赋值成为一个最大值(amount + 1),用于dp[i]表示无法凑齐对应金额。Arrays.fill(dp, amount + 1);// 理解 dp[0] = 0 的合理性,单独一枚硬币如果能够凑出面值,符合最优子结构
//将`dp[0]`初始化为0,表示凑齐金额0所需的最少硬币数量为0。dp[0] = 0;
//然后,使用两个嵌套的循环进行动态规划计算。外层循环从1到`amount`遍历所有可能的金额。
//内层循环遍历硬币数组`coins`中的每个硬币,判断是否可以使用当前硬币凑齐金额`i`。
//如果可以凑齐,即`i - coin >= 0`,并且凑齐`i - coin`金额所需的最少硬币数量不为`amount + 1`(表示可以凑齐),则更新`dp[i]`为`dp[i - coin]`和`dp[i]`的较小值加1,表示使用当前硬币后的最少硬币数量。通过上述循环,我们得到了凑齐每个金额所需的最少硬币数量。for (int i = 1; i <= amount; i++) {for (int coin : coins) {if (i - coin >= 0 && dp[i - coin] != amount + 1) {dp[i] = Math.min(dp[i], 1 + dp[i - coin]);}}}//最后,判断`dp[amount]`是否等于`amount + 1`,如果等于,则表示无法凑齐金额`amount`,将其赋值为-1。if (dp[amount] == amount + 1) {dp[amount] = -1;}
//返回`dp[amount]`作为结果,即为凑齐金额`amount`所需的最少硬币数量(如果无法凑齐则为-1)。return dp[amount];}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/832454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux字符设备驱动(一) - 框架

字符设备是Linux三大设备之一(另外两种是块设备&#xff0c;网络设备)&#xff0c;字符设备就是字节流形式通讯的I/O设备,绝大部分设备都是字符设备&#xff0c;常见的字符设备包括鼠标、键盘、显示器、串口等等&#xff0c;当我们执行ls -l /dev的时候&#xff0c;就能看到大量…

2024年5月6日优雅草蜻蜓API大数据服务中心v2.0.3更新

v2.0.3更新 2024年5月6日优雅草蜻蜓API大数据服务中心v2.0.3更新-修复改版后搜索框漏掉的bug-增加搜索框 提示&#xff1a;优雅草大数据中心已经 上线137天 稳定运行 1181555 次 累积调用 目前大数据中心用户呈现增长趋势&#xff0c;目标2024年11月底突破1亿次调用&#xf…

021、Python+fastapi,第一个Python项目走向第21步:ubuntu 24.04 docker 安装mysql8集群、redis集群(二)

系列文章目录 pythonvue3fastapiai 学习_浪淘沙jkp的博客-CSDN博客https://blog.csdn.net/jiangkp/category_12623996.html 前言 安装redis 我会以三种方式安装&#xff0c;在5月4号修改完成 第一、直接最简单安装&#xff0c;适用于测试环境玩玩 第二、conf配置安装 第三…

Redis的数据类型及使用场景

redis命令大全官网: Commands | Docs (redis.io) 基本介绍 redis起初主要就是为了解决性能问题的&#xff0c;那么redis为什么快? 基于内存操作的&#xff0c;所以操作不需要跟磁盘进行交互&#xff0c;单次的执行会很快 命令执行是单线程 因为基于内存操作 单次执行时间反…

Java面试题:多线程3

CAS Compare and Swap(比较再交换) 体现了一种乐观锁的思想,在无锁情况下保证线程操作共享数据的原子性. 线程A和线程B对主内存中的变量c同时进行修改 在线程A中存在预期值a,修改后的更新值a1 在线程B中存在预期值b,修改后的更新值b1 当且仅当预期值和主内存中的变量值相等…

MYSQL基础架构、执行过程分析、事务的实现、索引的选择、覆盖索引

本文是mysql45讲的1-5的总结 文章目录 基础架构连接器分析器优化器执行器SQL查询执行过程详细执行步骤 SQL更新执行过程重要的日志模块&#xff1a;redo log重要的日志模块&#xff1a;binlog阶段性提交 事务事务隔离的实现启动 索引数据库索引模型InnoDB索引组织结构主键选择…

【数据可视化-02】Seaborn图形实战宝典

Seaborn介绍 Seaborn是一个基于Python的数据可视化库&#xff0c;它建立在matplotlib的基础之上&#xff0c;为统计数据的可视化提供了高级接口。Seaborn通过简洁美观的默认样式和绘图类型&#xff0c;使数据可视化变得更加简单和直观。它特别适用于那些想要创建具有吸引力且信…

从零开始学RSA: [WUSTCTF2020]情书等5题

1 [WUSTCTF2020]情书 题目 Premise: Enumerate the alphabet by 0、1、2、..... 、25 Using the RSA system Encryption:0156 0821 1616 0041 0140 2130 1616 0793 Public Key:2537 and 13 Private Key:2537 and 937flag: wctf2020{Decryption}解题 前提&#xff1a;用0、…

高效、精准:皮秒激光切割机在陶瓷基板加工中的应用

皮秒激光切割机&#xff08;激光划片机&#xff09;在陶瓷基板切割领域具有显著的优势和潜力&#xff0c;主要体现在以下几个方面&#xff1a; 1. 高精度&#xff1a;皮秒激光切割机能够实现极高的切割精度&#xff0c;对于陶瓷基板这种需要精细加工的材料尤为重要。它能够在不…

【网络原理】IP协议详解

一.与IP协议相关的基本概念 IP协议&#xff0c;即网际互连协议&#xff08;Internet Protocol&#xff09;&#xff0c;是TCP/IP体系中的核心网络层协议。 网络层IP协议解决的问题 数据传输的过程中,不是直接进行的传输,而是经过层层的封装和分用的过程才能到达对端. IP协议主…

13 【PS作图】人物绘画理论-脸型

三庭五眼 三庭&#xff1a;脸的长度比例 &#xff08;1&#xff09;发际线到眉毛 &#xff08;2&#xff09;眉毛到鼻底 &#xff08;3&#xff09;鼻底到下巴 三个部分大致为三等分 五眼&#xff1a;脸的宽度比例 以眼睛长度为单位&#xff0c;把脸的宽度分成五等分&#x…

day1Qt作业

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {this->resize(540,415);//窗口大小this->setFixedSize(540,415);//固定窗口大小this->setWindowTitle("QQ");//标题this->setWindowIcon(QIcon("E:\\hqyjap…

大数据在互联网领域的“九大”应用

当下越来越多的应用涉及到大数据&#xff0c;而这些大数据的属性&#xff0c;包括数量&#xff0c;速度&#xff0c;多样性等等都呈现出大数据不断增长的复杂性&#xff0c;所以大数据的分析方法在大数据领域就显得尤为重要&#xff0c;目前互联网大数据运用的九大领域&#xf…

网络演进技术演进:裸纤专线、SDH、MSTP+、OTN、PTN、IP-RAN

前言 文章主要介绍常见名词以及其在各自领域实现的功能价值。 01 裸纤 裸光纤&#xff08;裸光纤&#xff09;由运营商提供&#xff0c;是无中继的光纤线路&#xff0c;仅通过配线架连接。相比传统光纤&#xff0c;裸光纤提供纯粹的物理传输路径&#xff0c;无需额外网…

Linux字符设备驱动-详解与实操:驱动架构、设备树、Pinctrl子系统和GPIO子系统、platform、设备树下的platform

如何编写一个驱动程序&#xff1a; &#xff08;1&#xff09;确定主设备号 &#xff08;2&#xff09;定义自己的file_operations结构体&#xff1a; 包含对应的open(drv_open)/read(drv_read)等设备操作函数&#xff0c;需要到内核中去注册 &#xff08;3&#xff09;实现…

为什么需要自动化测试?自动化有哪些优势?

前言 自动化测试&#xff0c;最近些年可谓是大火。招聘上的要求也好&#xff0c;培训班的广告也罢&#xff0c;比比皆是&#xff0c;足以说明它在业内的火爆程度。 虽然说会写自动化测试并不能说明你就很牛批&#xff0c;但是你不会的话&#xff0c;那么很抱歉&#xff0c;你…

力扣每日一题-拆炸弹-2024.5.5

力扣题目&#xff1a;拆炸弹 题目链接: 1652.拆炸弹 题目描述 代码思路 根据代码实现分为k等于0和k不等于0的情况。k等于0很容易处理&#xff0c;而k不等于0时&#xff0c;需要使用滑动窗口的方式来解决。先根据小于0或大于0确定一个窗口&#xff0c;然后移动&#xff0c;获…

【Mac】 DSync for mac(文件比较同步工具) v2.7安装教程

软件介绍 DSync是一款文件比较同步工具&#xff0c;通过简便的三步即可完成繁琐的比较、同步操作&#xff0c;您甚至可以通过跳过、删除或反转您选择的文件的复制方向来微调您的同步。这是在Mac上同步文件的最简单方法。 安装教程 1.打开安装包&#xff0c;将「DSync」拖到右…

YUM源仓库部署和NFS共享存储服务

一.YUM源仓库部署 1.YUM 概述 &#xff08;1&#xff09;是基于RPM软件包构建的软件更新机制 &#xff08;2&#xff09;可以自动解决依赖关系 &#xff08;3&#xff09;所有软件包有集中的YUM软件仓库提供 2.准备YUM源 &#xff08;1&#xff09;软件仓库的提供方式&…

个人直播/流媒体服务解决方案实践

目录 1. 说明 1.1 拓扑结构图 2. 准备工作 2.1 软硬件清单 3. 步骤 3.1 按上面的软硬件清单准备好材料 3.2 内网检查测试 3.3 透传到公网服务器 3.5 机顶盒配置 4. 总结 5. 参考 6. 后语 1. 说明 - 在本地局域网建立流媒体服务&#xff0c;并发布到公网服务器供终…