代码随想录算法训练营第三十三天丨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

相关文章

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

C++一个数组赋值给另一个数组方式

《C++一个数组赋值给另一个数组方式》文章介绍了三种在C++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意