代码随想录学习Day 29

ops/2024/10/19 3:26:22/

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

题目链接

讲解链接

思路:先对数组进行排序,保证数组中最小的值(也就是取反后损失最小的值)位于数组最前端。然后对数组进行遍历,在k次内尽可能将负数全部取反。当数组中元素全部>=0或者k为0时结束循环。此时再对数组进行排序,保证小数在前(因为可能对负数取反后导致原本顺序改变)。然后判断当前的k值,如果为偶数,则直接返回数组和(因为偶数次取反没有影响);如果是奇数,就将数组中最小的数取反,保证影响最低。

python">class Solution:def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:nums.sort()  # 先排序,保证负数在前for i in range(len(nums)):if nums[i] < 0 and k != 0:  # 尽可能多的将负数取反nums[i] = 0 - nums[i]k -= 1if all(item >= 0 for item in nums) or k == 0:  # 数组中全部>=0或者k为0时结束循环breaknums.sort()  # 再次排序if k % 2 == 0:  # k为偶数直接返回sumreturn sum(nums)else:nums[0] = 0 - nums[0]  # 奇数则对最小的数取反return sum(nums)

优化版本,根据绝对值进行排序,可以少进行一次数组排序的操作。

python">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

134.加油站

题目链接

讲解链接

暴力解法:

python">class Solution:def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:n = len(gas)for i in range(n):  # 外层i确定起始位置cur_gas = gas[i] - cost[i]  # 当前油箱中的油量index = (i + 1) % nwhile cur_gas > 0 and index != i:  # 用while循环模拟从i出发行驶一圈的过程cur_gas += gas[index] - cost[index]  # 当前油量变化index = (index + 1) % n  # 移动到下一个地点,因为是环形所以要取模if cur_gas >= 0 and index == i:  # 如果油量还有剩余或者刚好够,并且能够回到出发点return i  # 返回出发点的下标return -1

贪心法:可以换一个思路,首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈,说明 各个站点的加油站 剩油量rest[i]相加一定是大于等于零的。每个加油站的剩余量rest[i]为gas[i] - cost[i]。i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。

python">class Solution:def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:cur_sum, start, total = 0, 0, 0  # 当前累计剩余油量,起始位置,总剩余油量for i in range(len(gas)):cur_sum += gas[i] - cost[i]total += gas[i] - cost[i]if cur_sum < 0:  # 若当前剩余油量小于0start = i + 1  # 起始位置更新为i+1cur_sum = 0  # 重新从0开始统计if total < 0:return -1  # 总剩余油量totalSum小于0,说明无法环绕一圈return start

局部最优:当前累加rest[i]的和curSum一旦小于0,起始位置至少要是i+1,因为从i之前开始一定不行。

全局最优:找到可以跑一圈的起始位置。 

135.分发糖果

题目链接

讲解链接

思路:先从前往后遍历,处理所有右孩子评分大于左孩子评分的情况;在从后往前遍历,处理左孩子评分大于右孩子评分的情况。

局部最优:右边评分比左边大,右边多一个;左边评分比右边大,左边多一个。

全局最优:相邻孩子中,评分高的右孩子糖果比左边孩子多;评分高的左孩子糖果比右边孩子多。

当从后往前遍历时,如果遇到左孩子大于右孩子的情况,还需要考虑之前遍历过程中candy[i]的值,不能直接赋值为candy[i + 1] + 1,而是要取candy[i + 1] + 1 和 candy[i] 最大的糖果数量,candy[i]只有取最大的才能既保持对左边candy[i - 1]的糖果多,也比右边candy[i + 1]的糖果多

python">class Solution:def candy(self, ratings: List[int]) -> int:candy = [1] * len(ratings)  # 初始化candy数组全1,因为每个孩子都至少获得一个糖果for i in range(1, len(ratings)):  # 从前往后遍历,考虑右孩子大于左孩子的情况if ratings[i] > ratings[i - 1]:  # 如果右大于左candy[i] = candy[i - 1] + 1  # 右的糖果数为左+1for i in range(len(ratings) - 2, -1, -1):  # 从后往前遍历,考虑左孩子大于右孩子的情况if ratings[i] > ratings[i + 1]:  # 如果左大于右candy[i] = max(candy[i + 1] + 1, candy[i])  # 取两者最大值return sum(candy)  # 返回糖果总和

http://www.ppmy.cn/ops/15764.html

相关文章

Laravel 6 - 第八章 门面

​ 文章目录 Laravel 6 - 第一章 简介 Laravel 6 - 第二章 项目搭建 Laravel 6 - 第三章 文件夹结构 Laravel 6 - 第四章 生命周期 Laravel 6 - 第五章 控制反转和依赖注入 Laravel 6 - 第六章 服务容器 Laravel 6 - 第七章 服务提供者 Laravel 6 - 第八章 门面 Laravel 6 - …

TiDB 6.x 新特性解读 | Collation 规则

对数据库而言&#xff0c;合适的字符集和 collation 规则能够大大提升使用者运维和分析的效率。TiDB 从 v4.0 开始支持新 collation 规则&#xff0c;并于 TiDB 6.0 版本进行了更新。本文将深入解读 Collation 规则在 TiDB 6.0 中的变更和应用。 引 这里的“引”&#xff0c;…

【详细讲解CentOS常用的命令】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

设计模式-外观模式

外观设计模式 定义 何为外观&#xff0c;就是对外提供一个统一的入口&#xff0c;一是可以隐藏系统内部的细节&#xff0c;二是可以降低使用者的复杂度&#xff0c;比如SpringMvc中的DispaterServlet&#xff0c;所有的Controller都是通过DispaterServlet统一暴露。 使用场景…

【产品介绍】电力物联网是物联网在智能电网中的应用 支持Lora/LoraWAN/4G/WIFI

电力物联网是物联网在智能电网中的应用&#xff0c;是有效整合通信基础设施资源和电力基础设施资源&#xff0c;提高电力系统信息化水平&#xff0c;改善电力系统现有基础设施利用效率的重要举措。 电力物联网仪表为终端感知设备&#xff0c;该系列产品将我们多年的智能电力仪…

FPV眼镜和VR眼镜的区别,穿越机搭配FPV眼镜优缺点分析

FPV眼镜&#xff0c;即第一人称视角&#xff08;First Person View&#xff09;眼镜&#xff0c;是专为无人机、穿越机、遥控模型等飞行设备设计的头戴式显示器。这种设备能够将飞行设备上的摄像头所捕捉的实时图像传输到眼镜中&#xff0c;让佩戴者仿佛亲自驾驶飞行器一样&…

Oracle 21 C 安装详细操作手册,并配置客户端连接

Oracle 21 C 安装详细操作手册 Win 11 Oracle 21C 下载&#xff1a; Database Software Downloads | Oracle 中国 云盘共享 链接&#xff1a;https://pan.baidu.com/s/12XCilnFYyLFnSVoU_ShaSA 提取码&#xff1a;nfwc Oracle 21C 配置与登陆&#xff1a; 开始菜单 NetMa…

Java23种设计模式-结构型模式之外观模式

外观模式&#xff08;Facade Pattern&#xff09;&#xff1a;为复杂的系统提供了一个简单的统一接口&#xff0c;使得系统更易于使用和理解&#xff08;对外提供一个统一的方法&#xff0c;来访问子系统中的一群接口&#xff09; 外观模式三个核心角色&#xff1a; 角色1.外观…