代码随想录算法训练营第三十三天丨1005. K 次取反后最大化的数组和、134. 加油站、135. 分发糖果

本文主要是介绍代码随想录算法训练营第三十三天丨1005. K 次取反后最大化的数组和、134. 加油站、135. 分发糖果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

两次贪心:

先按绝对值排序,第一次从大到小反转绝对值大的负值。如果数组都非负了k还有剩余,一直反转绝对值最小的值直到k为0。

class Solution:def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:nums.sort(key = abs, reverse = True)for i in range(len(nums)):if k == 0:breakelif nums[i] < 0:nums[i] *= -1k -= 1print(nums)if k > 0:nums[-1]  = (-1) ** k * nums[-1]return sum(nums) 

134. 加油站

我的思路:

我的想法是,计算两个数组的差值数组,元素表示的就是从i 到 i + 1剩余的油量。由于是环形路线,将diff数组扩展一倍,如果存在非负最大子数组,最大子数组的起始点就是结果。

class Solution:def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:diffs = [gas[i] - cost[i] for i in range(len(gas))] * 2cur_max = global_max = diffs[0]i = 0for pos in range(1, len(diffs)):if cur_max < 0:i = poscur_max = diffs[pos]else:cur_max += diffs[pos]global_max = max(cur_max, global_max)return i if i < len(gas) else -1

优化:

实际上没有想到这道题的精髓,这道题不需要求最大子数组,大小什么的都无所谓,只要能是非负的就可以了。

首先要明确一点,如果总油量大于总消耗,一定从某点开始可以环绕一周,算法就是按照证明这一点设计的。如果总油量小于总消耗不能绕一周很好理解,那如何证明总油量不小于总消耗,一定可以环绕一周呢。

情况一:如果从0开始一直到n - 1一直是非负差值和,根据总油量不少于总消耗,说明从0开始就能绕一周,不需证明。

情况二:从0开始到i,在i处发现差值和为负,这说明从0到i总油量小于总消耗,从0到i任意一点开始无法到达i+1,但是整个环形线路总油量是大于总消耗的,说明假如从i + 1起步,i + 1到 n - 1之间,总油量是严格大于总消耗的,并且差值至少是之前累计的所有的负值。因此,把起始点移动到i + 1,继续累计差值,每次发现差值和为负,继续寻找下一个作为起点,直到某次ik + 1到 n - 1的差值和总为正,这说明从ik + 1不仅能到n - 1,还能弥补之前所有的负值和到达ik,因为总油量不小于总消耗,最终从ik能够到达ik + 1,ik + 1就是起点。

class Solution:def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:start = curSum = totalSum = 0for i in range(len(gas)):curSum += gas[i] - cost[i]totalSum += gas[i] - cost[i]if curSum < 0:start = i + 1curSum = 0if totalSum < 0: return -1 return start

135. 分发糖果

一次从左向右遍历,确保每个孩子比他左边评分高的孩子获得更多的糖果;另一次从右向左遍历,确保每个孩子比他右边评分高的孩子获得更多的糖果。通过这两次遍历,可以保证所有孩子的糖果数既满足左边的条件,也满足右边的条件。

class Solution:def candy(self, ratings: List[int]) -> int:n = len(ratings)candies = [1] * n# 从左向右确保评分高的孩子比他左边的孩子获得更多的糖果for i in range(1, n):if ratings[i] > ratings[i - 1]:candies[i] = candies[i - 1] + 1# 从右向左确保评分高的孩子比他右边的孩子获得更多的糖果for i in range(n - 2, -1, -1):if ratings[i] > ratings[i + 1]:candies[i] = max(candies[i], candies[i + 1] + 1)# 计算总糖果数return sum(candies)

好难想到的。

这篇关于代码随想录算法训练营第三十三天丨1005. K 次取反后最大化的数组和、134. 加油站、135. 分发糖果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/715183

相关文章

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

深入解析 Java Future 类及代码示例

《深入解析JavaFuture类及代码示例》JavaFuture是java.util.concurrent包中用于表示异步计算结果的核心接口,下面给大家介绍JavaFuture类及实例代码,感兴... 目录一、Future 类概述二、核心工作机制代码示例执行流程2. 状态机模型3. 核心方法解析行为总结:三

python获取cmd环境变量值的实现代码

《python获取cmd环境变量值的实现代码》:本文主要介绍在Python中获取命令行(cmd)环境变量的值,可以使用标准库中的os模块,需要的朋友可以参考下... 前言全局说明在执行py过程中,总要使用到系统环境变量一、说明1.1 环境:Windows 11 家庭版 24H2 26100.4061

pandas实现数据concat拼接的示例代码

《pandas实现数据concat拼接的示例代码》pandas.concat用于合并DataFrame或Series,本文主要介绍了pandas实现数据concat拼接的示例代码,具有一定的参考价值,... 目录语法示例:使用pandas.concat合并数据默认的concat:参数axis=0,join=

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L