代码随想录算法训练营第二十七天|Day27 贪心算法

122.买卖股票的最佳时机II

https://programmercarl.com/0122.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BAII.html

思路

int maxProfit(int* prices, int pricesSize) {int maxProfit = 0;for (int i = 1; i < pricesSize; i++) {if (prices[i] > prices[i - 1]) {maxProfit += prices[i] - prices[i - 1];}}return maxProfit; 
}

学习反思

  1. 这段代码使用了贪心算法的思想。通过在连续的价格上涨阶段买入股票,在连续的价格下降阶段卖出股票,可以获得最大利润。因此,我们只需要关注连续的上涨阶段,并计算上涨的差价即可。

  2. 程序使用一个循环遍历了整个价格数组。在循环中,通过比较当前价格和前一个价格的大小关系,判断是否是上涨的阶段。如果是上涨阶段,则将上涨价格的差值累加到最大利润上。

  3. 最后,返回最大利润。

  4. 这段代码的时间复杂度为O(n),其中n为价格数组的大小。

55. 跳跃游戏

https://programmercarl.com/0055.%E8%B7%B3%E8%B7%83%E6%B8%B8%E6%88%8F.html

思路

bool canJump(int* nums, int numsSize) {int maxReach = 0; for (int i = 0; i < numsSize; i++) {if (i > maxReach) {return false;}maxReach = (maxReach > i + nums[i]) ? maxReach : (i + nums[i]);if (maxReach >= numsSize - 1) {return true;}}return false; 
}

学习反思

  1. 这段代码使用了贪心算法的思想。通过遍历数组,依次更新能够跳跃的最远距离maxReach。如果maxReach能够到达数组末尾,就返回true;否则,返回false。

  2. 程序使用一个循环遍历整个数组,遍历过程中判断当前位置是否超过了maxReach。如果超过了maxReach,则说明无法到达当前位置,直接返回false。

  3. 在每个位置,更新maxReach的值。maxReach的更新规则是当前位置加上当前位置可以跳跃的最大距离,与之前的maxReach比较取较大值。

  4. 如果maxReach能够到达数组末尾,就返回true。

  5. 最后,如果整个循环结束仍然没有返回true,则说明无法到达数组末尾,返回false。

  6. 这段代码的时间复杂度为O(n),其中n为数组的大小。

45.跳跃游戏II

https://programmercarl.com/0045.%E8%B7%B3%E8%B7%83%E6%B8%B8%E6%88%8FII.html

思路

int jump(int* nums, int numsSize) {if (numsSize <= 1) {return 0; }int jumps = 0;            int currentEnd = 0;     int farthest = 0;        for (int i = 0; i < numsSize - 1; i++) {farthest = (farthest > i + nums[i]) ? farthest : (i + nums[i]); if (i == currentEnd) { jumps++;           currentEnd = farthest; if (currentEnd >= numsSize - 1) {break;}}}return jumps; 
}

学习反思

  1. 这段代码使用了贪心算法的思想。通过遍历数组,依次更新最远能够到达的位置farthest。在每个位置,判断是否到达了当前跳跃的最远位置currentEnd。如果到达了currentEnd,就进行一次跳跃,跳跃次数加一,并更新currentEnd为farthest。

  2. 程序使用了一个循环遍历整个数组,遍历过程中判断是否到达了currentEnd。如果到达了currentEnd,就进行一次跳跃,并更新currentEnd为farthest。

  3. 在每个位置,更新farthest的值。farthest的更新规则是当前位置加上当前位置的跳跃长度,与之前的farthest比较取较大值。

  4. 如果当前能够到达最后一个位置,就提前返回跳跃次数。

  5. 最后,返回跳跃次数。

  6. 这段代码的时间复杂度为O(n),其中n为数组的大小。

1005.K次取反后最大化的数组和

https://programmercarl.com/1005.K%E6%AC%A1%E5%8F%96%E5%8F%8D%E5%90%8E%E6%9C%80%E5%A4%A7%E5%8C%96%E7%9A%84%E6%95%B0%E7%BB%84%E5%92%8C.html

思路

#define abs(a) (((a) > 0) ? (a) : (-(a)))
int sum(int *nums, int numsSize) {int sum = 0;int i;for(i = 0; i < numsSize; ++i) {sum += nums[i];}return sum;
}
int cmp(const void* v1, const void* v2) {return abs(*(int*)v2) - abs(*(int*)v1);
}
int largestSumAfterKNegations(int* nums, int numsSize, int k){qsort(nums, numsSize, sizeof(int), cmp);int i;for(i = 0; i < numsSize; ++i) {if(nums[i] < 0 && k > 0) {nums[i] *= -1;--k;}}if(k % 2 == 1)nums[numsSize - 1] *= -1;return sum(nums, numsSize);
}

学习反思

  1. 该代码使用了C语言的宏定义来定义计算绝对值的函数abs(a),其中使用了三目运算符来判断a的正负。

  2. 代码中定义了一个sum函数,用于计算数组中元素的和。通过遍历数组并累加元素的值来实现。

  3. 定义了一个比较函数cmp,用于qsort函数进行排序时使用。该比较函数首先将要比较的元素转成指针形式,再通过解引用符*来获取元素的值,然后计算绝对值,最后通过减法比较两个元素的绝对值大小。

  4. 在largestSumAfterKNegations函数中,首先使用qsort函数对数组进行排序,排序的依据是绝对值从大到小。这样排序之后,负数会排在数组的前面,正数会排在数组的后面。

  5. 然后通过遍历数组,若当前元素小于0并且k大于0,就将当前元素取反,并将k减一。这个过程实际上就是将数组中前k个负数取反的操作。

  6. 如果循环结束后k仍然大于0,说明数组中所有的元素都已经取反了,此时将绝对值最小的元素取反即可。

  7. 最后,通过调用sum函数计算最终数组的和,并返回。

  8. 这段代码的时间复杂度为O(nlogn),其中n为数组的大小,主要的开销在于排序操作。

 总结

又是贪心算法的一天,加油!!!

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

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

相关文章

ArcGIS001:ArcGIS10.2安装教程

摘要&#xff1a;本文详细介绍arcgis10.2的安装、破解、汉化过程。 一、软件下载 安装包链接&#xff1a;https://pan.baidu.com/s/1T3UJ7t_ELZ73TH2wGOcfpg?pwd08zk 提取码&#xff1a;08zk 二、安装NET Framework 3.5 双击打开控制面板&#xff0c;点击【卸载程序】&…

dbt-codegen: dbt自动生成模板代码

dbt项目采用工程化思维&#xff0c;数据模型分层实现&#xff0c;支持描述模型文档和测试&#xff0c;非常适合大型数据工程项目。但也需要用户编写大量yaml描述文件&#xff0c;这个过程非常容易出错且无聊。主要表现&#xff1a; 手工为dbt模型编写yaml文件&#xff0c;这过…

STM32传感器模块编程实践(十一) ADC模数转换模块ADS1115简介及驱动源码

文章目录 一.概要二.ADS1115芯片介绍三.ADS1115芯片主要特性四.ADS1115模块接线说明五.ADS1115参考原理图六.通讯协议介绍七.STM32单片机与ADS1115模块实现电压采集实验1.硬件准备2.软件工程3.软件主要代码4.实验效果 八.源代码工程下载九.小结 一.概要 ADC&#xff0c;全称为…

认识和使用 Vite 环境变量配置,优化定制化开发体验

Vite 官方中文文档&#xff1a;https://cn.vitejs.dev/ 环境变量 Vite 内置的环境变量如下&#xff1a; {"MODE": "development", // 应用的运行环境"BASE_URL": "/", // 部署应用时使用的 URL 前缀"PROD": false, //应用…

JavaScript完整笔记

JS引入 JavaScript 程序不能独立运行&#xff0c;它需要被嵌入 HTML 中&#xff0c;然后浏览器才能执行 JavaScript 代码。 通过 script 标签将 JavaScript 代码引入到 HTML 中&#xff0c;有两种方式&#xff1a; 内部方式 通过 script 标签包裹 JavaScript 代码 我们将 &…

使用FRP搭建内网穿透服务(新版toml配置文件,搭配反向代理方便内网网站访问)【使用frp搭建内网穿透】

FRP&#xff08;Fast Reverse Proxy&#xff09;是一个高性能的反向代理应用程序&#xff0c;主要用于内网穿透。它允许用户将内部网络服务暴露到外部网络&#xff0c;适用于 NAT 或防火墙环境下的服务访问。 他是一个开源的 服务 如果大家不想用 花生壳 软件&#xff0c;可以尝…

卷积神经网络评价指标

1.评价指标的作用 1. 性能评估&#xff1a;评价指标提供了一种量化的方式来衡量CNN模型的性能。通过这些指标&#xff0c;我们可以了解模型在特定任务上的表现&#xff0c;比如图像分类、目标检测或图像分割等。 2. 模型比较&#xff1a;不同的模型架构或训练策略可能会产生不…

基于SSM考研助手系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;教学秘书管理&#xff0c;考研资讯管理&#xff0c;考研名师管理&#xff0c;考研信息管理&#xff0c;系统管理 教学秘书账号功能包括&#xff1a;系统首页&#xff0c;个人中心…

如何快速解决游戏提示系统中的emp.dll缺失问题

emp.dll是一个动态链接库&#xff08;Dynamic Link Library, DLL&#xff09;文件&#xff0c;这类文件在Windows操作系统中扮演着至关重要的角色。它们包含了可由多个程序同时使用的代码和数据&#xff0c;其主要目的是实现模块化&#xff0c;以便于程序的更新和动态链接。emp…

es实现自动补全

目录 自动补全 拼音分词器 安装拼音分词器 第一步&#xff1a;下载zip包&#xff0c;并解压缩 第二步&#xff1a;去docker找到es-plugins数据卷挂载的位置&#xff0c;并进入这个目录 第三步&#xff1a;把拼音分词器的安装包拖到这个目录下 第四步&#xff1a;重启es 第…

RV1126音视频学习(二)-----VI模块

文章目录 前言2.RV1126的视频输入vi模块2.1什么是VI模块2.3RV1126VI模块主要APIRK_MPI_SYS_Init()RK_MPI_VI_SetChnAttrRK_MPI_VI_EnableChnRK_S32 RK_MPI_VI_DisableChnRK_MPI_VI_StartStreamRK_MPI_SYS_GetMediaBufferRK_MPI_MB_GetPtrRK_MPI_MB_GetSizeRK_MPI_MB_ReleaseBuf…

【NOIP提高组】加分二叉树

【NOIP提高组】加分二叉树 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 设一个n个节点的二叉树tree的中序遍历为&#xff08;l,2,3,…,n&#xff09;&#xff0c;其中数字1,2,3,…,n为节点编号。每个节点都有一个分数&#xff08;均为正整…

读《认知觉醒》:浅谈费曼技巧

最近在阅读《认知觉醒》这本书&#xff0c;封面如下&#xff1a; 读到了里面对于费曼技巧的介绍&#xff08;在第八章&#xff09;&#xff0c;感觉受到了一些启发&#xff0c;在这里分享给大家。 其实之前很早就接触过了费曼技巧&#xff0c;但是并没有很好的应用起来&#x…

零代码快速开发智能体 |甘肃旅游通

零代码快速开发智能体 &#xff5c;甘肃旅游通 本文仅用于文心智能体的活动征文 参与人&#xff1a;mengbei_admin 文心智能体平台是人工智能领域的佼佼者。它拥有强大的语言理解与生成能力&#xff0c;能精准回应各种问题&#xff0c;出色完成文本创作、知识问答和翻译等任…

线性表之双向链表

链表花里胡哨&#xff0c;一应俱全 前言 在这之前&#xff0c;我们已经学习了单链表。我们发现这些链表都是一个接一个朝一个方向接下去&#xff0c;有时&#xff0c;我们想要查找某个结点的时候还得从头开始遍历查找&#xff0c;尽管我们已经学习了顺序表&#xff0c;查找某个…

免费PDF页面提取小工具

下载地址 https://download.csdn.net/download/woshichenpi/89922797 使用说明&#xff1a;PDF页面提取工具 1. 启动应用程序 双击程序的启动图标或者通过命令行运行程序。 2. 选择PDF文件 在应用程序窗口中找到“选择PDF”按钮并点击它。在弹出的文件选择对话框中&#x…

Windows server 2003服务器的安装

Windows server 2003服务器的安装 安装前的准备&#xff1a; 1.镜像SN序列号 图1-1 Windows server 2003的安装包非常人性化 2.指定一个安装位置 图1-2 选择好安装位置 3.启动虚拟机打开安装向导 图1-3 打开VMware17安装向导 图1-4 给虚拟光驱插入光盘镜像 图1-5 输入SN并…

Linux系统安装Redis详细操作步骤(二进制发布包安装方式)

安装方式介绍 在Linux系统中&#xff0c;安装软件的方式主要有四种&#xff0c;这四种安装方式的特点如下&#xff1a; 安装方式特点二进制发布包安装软件已经针对具体平台编译打包发布&#xff0c;只要解压&#xff0c;修改配置即可rpm安装软件已经按照redhat的包管理规范进…

Redis 集群 总结

前言 相关系列 《Redis & 目录》&#xff08;持续更新&#xff09;《Redis & 集群 & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Redis & 集群 & 总结》&#xff08;学习总结/最新最准/持续更新&#xff09;《Redis & 集群…

计算机网络:网络层 —— IPv4 地址与 MAC 地址 | ARP 协议

文章目录 IPv4地址与MAC地址的封装位置IPv4地址与MAC地址的关系地址解析协议ARP工作原理ARP高速缓存表 IPv4地址与MAC地址的封装位置 在数据传输过程中&#xff0c;每一层都会添加自己的头部信息&#xff0c;最终形成完整的数据包。具体来说&#xff1a; 应用层生成的应用程序…