算法打卡day29

news/2024/4/30 15:22:05/文章来源:https://blog.csdn.net/wenxiaohai123/article/details/137588540

今日任务:

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

2)134.加油站

3)135.分发糖果

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

题目链接:1005. K 次取反后最大化的数组和 - 力扣(LeetCode)

给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。)
以这种方式修改数组后,返回数组可能的最大和。

示例 1:
输入:A = [4,2,3], K = 1
输出:5
解释:选择索引 (1) ,然后 A 变为 [4,-2,3]。

示例 2:
输入:A = [3,-1,0,2], K = 3
输出:6
解释:选择索引 (1, 2, 2) ,然后 A 变为 [3,1,0,2]。

示例 3:
输入:A = [2,-3,-1,5,-4], K = 2
输出:13
解释:选择索引 (1, 4) ,然后 A 变为 [2,3,-1,5,4]。

提示:
1 <= A.length <= 10000
1 <= K <= 10000
-100 <= A[i] <= 100

文章讲解:代码随想录 (programmercarl.com)

视频讲解:贪心算法,这不就是常识?还能叫贪心?LeetCode:1005.K次取反后最大化的数组和哔哩哔哩bilibili

思路:

这题比较简单。

如果数组中有负数,且k!=0,那我们只需要将最小的负数反转就行了。

如果数组中没有负数,且k还是不为0,那我们只需要不停将最小值反转即可,这里可以先判断k,如果为偶数,不断反转后还是原来数字不变。如果k为奇数,最后为原来数字的相反数。

class Solution:def largestSumAfterKNegations(self, A: List[int], K: int) -> int:A.sort(key=lambda x: abs(x), reverse=True)  # 第一步:按照绝对值降序排序数组Afor i in range(len(A)):  # 第二步:执行K次取反操作if A[i] < 0 and K > 0:A[i] *= -1K -= 1if K % 2 == 1:  # 第三步:如果K还有剩余次数,将绝对值最小的元素取反A[-1] *= -1result = sum(A)  # 第四步:计算数组A的元素和return result

感想:

正常思路我们先排序,按顺序反转即可。但是代码中,我们是按绝对值大小排序的,为什么要按绝对值的大小排序呢?这里有个技巧,因为这样遍历能保证,数组全为正数后,依旧是有序的,我们很容易取到最小值。当然如果数组还没有全为正,k已经没了,那也就不存在找最小值

134.加油站

题目链接:134. 加油站 - 力扣(LeetCode)

在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。

如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。

说明:
如果题目有解,该答案即为唯一答案。
输入数组均为非空数组,且长度相同。
输入数组中的元素均为非负数。

示例 1:
输入:
gas = [1,2,3,4,5]
cost = [3,4,5,1,2]
输出: 3
解释:
从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油
开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油
开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油
开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油
开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油
开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。
因此,3 可为起始索引。

示例 2:
输入:
gas = [2,3,4]
cost = [3,4,3]
输出: -1
解释: 你不能从 0 号或 1 号加油站出发,因为没有足够的汽油可以让你行驶到下一个加油站。我们从 2 号加油站出发,可以获得 4 升汽油。 此时油箱有 = 0 + 4 = 4 升汽油。开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油。开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油。你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。因此,无论怎样,你都不可能绕环路行驶一周。

文章讲解:代码随想录 (programmercarl.com)

视频讲解:贪心算法,得这么加油才能跑完全程!LeetCode :134.加油站哔哩哔哩bilibili

思路:

  • 首先,我们需要确保整个环路是可行的,也就是说,总加油量必须大于等于总消耗量。
  • 如果总加油量小于总消耗量,那么无论从哪个加油站出发,都不可能绕行一周。
  • 如果总加油量大于等于总消耗量,那么一定存在某个加油站,从该加油站出发可以绕行一周。
  • 我们可以通过模拟的方式,从每个加油站出发进行测试,看是否能够绕行一周。
  • 在模拟过程中,我们需要维护当前油箱中的汽油量,如果油箱中汽油不足以到达下一个加油站,则当前加油站不能作为出发点。
  • 当前加油站作为出发点的条件是,从当前加油站出发到下一个加油站时,油箱中汽油量必须大于等于0。

class Solution:def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:total_gas = sum(gas)  # 计算总加油量total_cost = sum(cost)  # 计算总消耗量# 如果总加油量小于总消耗量,则无法绕行一周,返回 -1if total_gas < total_cost:return -1n = len(gas)start = 0  # 初始出发点tank = 0  # 当前油箱中的汽油量# 从每个加油站开始模拟测试for i in range(n):tank += gas[i] - cost[i]  # 更新油箱中的汽油量# 如果油箱中汽油量小于0,说明无法到达下一个加油站,当前加油站不能作为出发点if tank < 0:start = i + 1  # 更新出发点为下一个加油站tank = 0  # 重置油箱中的汽油量return start  # 返回出发点

 这段代码首先计算了总加油量和总消耗量,如果总加油量小于总消耗量,则无法绕行一周,直接返回 -1。接下来,使用一个循环从每个加油站开始模拟测试,检查是否能够绕行一周。在模拟过程中,维护一个当前油箱中的汽油量变量,如果汽油量小于0,则更新出发点并重置油箱中的汽油量。

虽然,逻辑上我们应该先判断总加油量与总消耗量,符合要求再去比较,不过这里sum函数也需要遍历一遍历数组,所以在代码中,我们可以将计算总消耗与总加油量放到一个for循环中

class Solution:def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:total_gas = 0total_cost = 0cur_gas = 0start = 0for i in range(len(gas)):total_gas += gas[i]total_cost += cost[i]cur_gas += gas[i] - cost[i]# 如果当前汽油量小于0,说明无法到达下一个加油站,更新起始加油站为下一个加油站,并重置当前汽油量if cur_gas < 0:start = i + 1cur_gas = 0# 如果总加油量小于总消耗量,则无法绕行一周,返回 -1if total_gas < total_cost:return -1return start

135.分发糖果

题目链接:135. 分发糖果 - 力扣(LeetCode)

老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。
你需要按照以下要求,帮助老师给这些孩子分发糖果:
每个孩子至少分配到 1 个糖果。
相邻的孩子中,评分高的孩子必须获得更多的糖果。
那么这样下来,老师至少需要准备多少颗糖果呢?

示例 1:
输入: [1,0,2]
输出: 5
解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。

示例 2:
输入: [1,2,2]
输出: 4
解释: 你可以分别给这三个孩子分发 1、2、1 颗糖果。第三个孩子只得到 1 颗糖果,这已满足上述两个条件。

文章讲解:代码随想录 (programmercarl.com)

视频讲解:贪心算法,两者兼顾很容易顾此失彼!LeetCode:135.分发糖果哔哩哔哩bilibili

思路:

初始化糖果分配:首先,我们为每个孩子都分配一颗糖果。

从左向右遍历分发糖果:我们从左向右遍历孩子,并检查相邻孩子的评分情况。如果当前孩子的评分比左边孩子高,则我们给当前孩子分配的糖果数量比左边孩子多1个。

从右向左遍历修正糖果数量:在上一步中,我们确保了相邻孩子中评分更高的孩子获得了更多的糖果。但是,可能存在一种情况,即某个孩子评分虽然比右边孩子高,但是分配的糖果数量不多于右边孩子。这种情况下,我们需要从右向左遍历修正糖果数量,确保每个孩子都至少获得了其右边孩子分配的糖果数量加1个。

很明显孩子4,5,6评分比右边高,但是糖果并没有多。所以我们要再次从右向左遍历更新糖果

计算总糖果数量:最后,我们将所有孩子分配的糖果数量相加,得到总的糖果数量。这个总数满足了题目要求,即老师至少需要准备的糖果数量。

这样的思路确保了每个孩子都至少分配到了一个糖果,并且满足了相邻孩子中评分更高的孩子获得更多糖果的要求,从而得到了正确的答案。

class Solution:def candy(self, ratings: List[int]) -> int:# 初始化糖果分配数组,每个孩子至少一个糖果candyVec = [1] * len(ratings)# 从前向后遍历,处理右侧比左侧评分高的情况for i in range(1, len(ratings)):if ratings[i] > ratings[i - 1]:candyVec[i] = candyVec[i - 1] + 1# 从后向前遍历,处理左侧比右侧评分高的情况for i in range(len(ratings) - 2, -1, -1):if ratings[i] > ratings[i + 1]:candyVec[i] = max(candyVec[i], candyVec[i + 1] + 1)# 统计结果result = sum(candyVec)return result

感想:

这题不好想,不用代码实现也不好方法。直接理解思想然后实现代码即可

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

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

相关文章

MySQL分库分表的方式有哪些

目录 一、为什么要分库分表 二、什么是分库分表 三、分库分表的几种方式 1.垂直拆分 2. 水平拆分 四、分库分表带来的问题 五、分库分表技术如何选型 一、为什么要分库分表 如果一个网站业务快速发展&#xff0c;那这个网站流量也会增加&#xff0c;数据的压力也会随之而…

使用pytorch构建有监督的条件GAN(conditional GAN)网络模型

本文为此系列的第四篇conditional GAN&#xff0c;上一篇为WGAN-GP。文中在无监督的基础上重点讲解作为有监督对比无监督的差异&#xff0c;若有不懂的无监督知识点可以看本系列第一篇。 原理 有条件与无条件 如图投进硬币随机得到一个乒乓球的例子可以看成是一个无监督的GAN&…

Harmony鸿蒙南向驱动开发-UART

UART指异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09;&#xff0c;是通用串行数据总线&#xff0c;用于异步通信。该总线双向通信&#xff0c;可以实现全双工传输。 两个UART设备的连接示意图如下&#xff0c;UART与其他模块一般用2线&a…

Golang快速入门教程(一)

目录 一、环境搭建 1.windows安装 2.linux安装 3.开发工具 二、变量定义与输入输出 1.变量定义 2.全局变量与局部变量 3.定义多个变量 4.常量定义 5.命名规范 6.输出 7.输入 三、基本数据类型 1.整数型 2.浮点型 3.字符型 4.字符串类型 转义字符 多行字符…

HWOD:投票统计

一、知识点 1、单词 候选人的英文是Candidate 投票的英文是vote 投票人的英文是voter 2、for循环 如果在for循环内将i置为n&#xff0c;结束该层循环后&#xff0c;for循环会先给i加1,然后再去判读i是否小于n&#xff0c;所以for循环结束后&#xff0c;i的值为n1 3、字符…

idm线程越多越好吗 idm线程数多少合适 IDM百度云下载 IDM下载器如何修改线程数

IDM&#xff08;Internet Download Manager&#xff09;是一款流行的网络下载器&#xff0c;它支持多线程下载&#xff0c;这意味着它可以同时建立多个连接来下载文件的不同部分&#xff0c;从而提高下载速度。我们在使用IDM的时候总是有很多疑问&#xff0c;今天我们学习IDM线…

Unity 遮罩

编辑器版本 2017.2.3f1 学习Unity的三张遮罩方式 1. Mask 遮罩方式 首先&#xff0c;在界面上创建2个Image&#xff0c;一个命名Img_Mask,大小设置 400* 400&#xff0c; 一个命名Img_Show,大小设置500*500。 然后&#xff0c;给 Img_Mask添加Mask,选择Img_Mask,点击Add Com…

数据可视化-ECharts Html项目实战(11)

在之前的文章中&#xff0c;我们学习了如何在ECharts中特殊图表的双y图以及自定义形状词云图。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 数据可视化-ECh…

基于springboot+vue实现新闻推荐系统项目【项目源码+论文说明】

基于springboot实现新闻推荐系统演示 摘要 随着信息互联网购物的飞速发展&#xff0c;国内放开了自媒体的政策&#xff0c;一般企业都开始开发属于自己内容分发平台的网站。本文介绍了新闻推荐系统的开发全过程。通过分析企业对于新闻推荐系统的需求&#xff0c;创建了一个计算…

文件输入/输出流(I/O)

文章目录 前言一、文件输入\输出流是什么&#xff1f;二、使用方法 1.FileInputStream与FileOutputStream类2.FileReader与FileWriter类总结 前言 对于文章I/O(输入/输出流的概述)&#xff0c;有了下文。这篇文章将具体详细展述如何向磁盘文件中输入数据&#xff0c;或者读取磁…

第37篇:分频器<四>

Q&#xff1a;介绍完计数器分频电路概念原理之后&#xff0c;本期我们设计实现四分频计数器分频电路。 A&#xff1a;使用DE2-115开发板的KEY[1]作为时钟i_clk输入&#xff0c;KEY[0]作为清零复位i_rst输入&#xff0c;LEDR[0]显示分频后的时钟o_clk输出值&#xff0c;LEDR[3:…

虚拟货币:数字金融时代的新工具

在数字化时代的到来之后&#xff0c;虚拟货币逐渐成为了一种广为人知的金融工具。虚拟货币是一种数字化的资产&#xff0c;它不像传统货币那样由政府或中央银行发行和监管。相反&#xff0c;虚拟货币通过密码学技术和分布式账本技术来实现去中心化的发行和交易。 虚拟货币的代…

【C语言基础】:编译和链接(计算机中的翻译官)

文章目录 一、翻译环境和运行环境1. 翻译环境1.1 编译1.1.1 预处理1.1.2 编译1.1.3 汇编 1.2 链接 2. 运行环境 一、翻译环境和运行环境 我们在Visual Studio上写的C语言代码其实都是一些文本信息&#xff0c;计算机是不能够直接执行他们的&#xff0c;计算机只能够执行二进制…

RabbitMQ-canal 监听本地数据库 -收不到消息解决方法

一、当我们配置好canal 的配置文件后 发现log 日志不报错&#xff0c;但是消息队列就是监听不到数据库的消息。 二、解决方法 在mysql 的ini 配置文件中加入下列代码 connect_timeout60 # 将默认值&#xff08;如30秒&#xff09;改为60秒 wait_timeout28800 # 将空闲连接超时…

代码随想录35期Day08-字符串

344.反转字符串 位运算 func reverseString(s []byte) {l : 0r : len(s) - 1for l < r {s[l] ^ s[r]s[r] ^ s[l]s[l] ^ s[r]lr--} }541. 反转字符串II 没技巧 func reverseStringRange(s []byte, l int, r int) {if r > len(s) {r len(s) - 1}for l < r {s[l] ^…

如何在极狐GitLab 使用Docker 仓库功能

本文作者&#xff1a;徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了如何在[极狐GitLab…

ModStartCMS(支持Laravel 9)v8.3.0

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议&#xff0c;免费且不限制商业使用。 功能特性 丰富的模块市…

SpringBoot入门(Hello World 项目)

SpringBoot关键结构 1.2.1 Core Container The Core Container consists of the Core, Beans, Context, and Expression Language modules. The Core and Beans modules provide the fundamental parts of the framework, including the IoC and Dependency Injection featur…

面试算法-166-排序链表

题目 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4] 解 class Solution {public ListNode sortList(ListNode head) {if (head null || head.next null…

Vue 有哪些常用的指令

目录 1. 指令 v-html 1.1. 作用 1.2. 语法 1.3. 练习 2. 指令 v-show 2.1. 作用 2.2. 语法 3. 原理 4. 场景 3. 指令 v-if 3.1. 作用 3.2. 语法 3.3. 原理 3.4. 场景 4. 指令 v-else与 v-else-if 4.1. 作用 4.2. 语法 4.3. 注意 4.4. 使用场景 5. 指令 v-on 5…