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

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

题目链接:https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/description/
文章链接: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

思路

贪心的思路,局部最优:让绝对值大的负数变为正数,当前数值达到最大,整体最优:整个数组和达到最大。

局部最优可以推出全局最优。

那么如果将负数都转变为正数了,K依然大于0,此时的问题是一个有序正整数序列,如何转变K次正负,让 数组和 达到最大。

那么又是一个贪心:局部最优:只找数值最小的正整数进行反转,当前数值和可以达到最大(例如正整数数组{5, 3, 1},反转1 得到-1 比 反转5得到的-5 大多了),全局最优:整个 数组和 达到最大。

    // 贪心算法:尽量算则负数进行取反;在负数中尽量选择小的负数进行取反;都是正数后选择最小的正数进行重复取反,直到把K用完public int largestSumAfterKNegations(int[] nums, int k) {// 按照绝对值大小从大到小排序nums = IntStream.of(nums).boxed().sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1)).mapToInt(Integer::intValue).toArray();for (int i = 0; i < nums.length; i++) {// 遇到负数变正数,K--if (nums[i] < 0 && k > 0) {nums[i] = -nums[i];k--;}}// 如果k依然大于0,那么反复最小的正数元素,即最后一个元素,将k用完// 若k为偶数,反复转变一个元素应该不变,若为奇数,其实只转变一次if (k % 2 == 1)nums[nums.length - 1] = -nums[nums.length - 1];return Arrays.stream(nums).sum();}

LeetCode 134. 加油站

题目链接:https://leetcode.cn/problems/gas-station/description/
文章链接:https://programmercarl.com/0134.%E5%8A%A0%E6%B2%B9%E7%AB%99.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE

思路

可以换一个思路,首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈,说明 各个站点的加油站 剩油量rest[i]相加一定是大于等于零的。

每个加油站的剩余量rest[i]为gas[i] - cost[i]。

i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。
在这里插入图片描述

    public int canCompleteCircuit(int[] gas, int[] cost) {int totalSum = 0;int curSum = 0;int index = 0;for (int i = 0; i < gas.length; i++) {curSum +=  gas[i]-cost[i];totalSum += gas[i] + cost[i];if (curSum < 0){curSum = 0;index = (i + 1) % gas.length;}}if (totalSum < 0)return -1;return index;}

LeetCode 135. 分发糖果

题目链接:https://leetcode.cn/problems/candy/description/
文章链接:https://programmercarl.com/0135.%E5%88%86%E5%8F%91%E7%B3%96%E6%9E%9C.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE

思路

这道题目一定是要确定一边之后,再确定另一边,例如比较每一个孩子的左边,然后再比较右边,如果两边一起考虑一定会顾此失彼。

先确定右边评分大于左边的情况(也就是从前向后遍历)
在这里插入图片描述
再确定左孩子大于右孩子的情况(从后向前遍历)

遍历顺序这里有同学可能会有疑问,为什么不能从前向后遍历呢?

因为 rating[5]与rating[4]的比较 要利用上 rating[5]与rating[6]的比较结果,所以 要从后向前遍历。

如果从前向后遍历,rating[5]与rating[4]的比较 就不能用上 rating[5]与rating[6]的比较结果了 。如图:
在这里插入图片描述
如果 ratings[i] > ratings[i + 1],此时candyVec[i](第i个小孩的糖果数量)就有两个选择了,一个是candyVec[i + 1] + 1(从右边这个加1得到的糖果数量),一个是candyVec[i](之前比较右孩子大于左孩子得到的糖果数量)。

那么又要贪心了,局部最优:取candyVec[i + 1] + 1 和 candyVec[i] 最大的糖果数量,保证第i个小孩的糖果数量既大于左边的也大于右边的。全局最优:相邻的孩子中,评分高的孩子获得更多的糖果。

    public int candy(int[] ratings) {int[] candy = new int[ratings.length];Arrays.fill(candy, 1);// 先判断右边孩子的评分是不是比左边孩子的评分高,若高,则糖果数量加一for (int i = 1; i < ratings.length; i++) {if (ratings[i] > ratings[i - 1])candy[i] = candy[i - 1] + 1;}// 再左边还有糖果数量是不是比右边孩子多,自右向左比较,要利用到右边的结果for (int i = ratings.length - 2; i >= 0; i--) {if (ratings[i] > ratings[i + 1])candy[i] = Math.max(candy[i], candy[i + 1] + 1);}return Arrays.stream(candy).sum();}

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

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

相关文章

微信小程序页面配置

页面配置 小程序的配置可以配置页面路径、窗口表现、tabBar等&#xff0c;分为全局配置和页面配置&#xff0c;全局配置针对所有页面生效&#xff0c;页面配置只针对当前页生效。 全局配置 (app.json) (1) 路径配置 pages 配置页面路径&#xff0c;未配置路径的页面无法被访…

idea开发工具清除Git凭证(含Git凭证管理策略)

前言 网上很多人出现这个问题&#xff0c;也有很多文章或博客来说明这个问题&#xff0c;但是几乎都没有说到点子上&#xff0c;全网几乎都说清除credential.helper配置或者清空windows凭证管理器&#xff0c;还有一些文章说清除IDEA缓存&#xff0c;其实都是不对的。 creden…

数据仓库之拉链表

数据仓库中的拉链表&#xff08;也称为历史表或慢速变化维度表&#xff09;是一种设计模式&#xff0c;用于记录维度表中数据的历史变化。拉链表通过记录每次变化的数据快照&#xff0c;保留了完整的历史信息&#xff0c;可以用于追溯分析和历史数据查询。以下是拉链表的详细介…

黑龙江三级等保测评内容与等级划分

一、黑龙江等保三级测评内容 黑龙江等保三个层次&#xff0c;也就是三个级别的信息安全防护&#xff0c;这是我们国家的一项基础性的信息安全体系。在此基础上&#xff0c;提出了一种适用于非银行机构的最高级别的保障制度&#xff0c;即当该制度遭到破坏时&#xff0c;可能给…

Python自动化测试框架:unittest与pytest的深度对比

引言 在Python的自动化测试领域&#xff0c;unittest和pytest是两个非常流行的框架。它们各自有着独特的优势和使用场景。本文将从多个维度对这两个框架进行深入的比较和分析。 一、测试用例编写规范 unittest框架 遵循严格的继承和命名规则&#xff0c;确保测试结构的清晰…

Bankless:为什么 AI 需要 Crypto 的技术?

原文标题&#xff1a;《Why AI Needs Crypto’s Values》 撰文&#xff1a;Arjun Chand&#xff0c;Bankless 编译&#xff1a;Chris&#xff0c;Techub News 原文来自香港Web3媒体&#xff1a;Techub News 人工智能革命的梦想一直是一把双刃剑。 释放人工智能的潜力可以解…

springboot3一些听课笔记

文章目录 一、错误处理机制1.1 默认1.2 自定义 二、嵌入式容器 一、错误处理机制 1.1 默认 错误处理的自动配置都在ErrorMvcAutoConfiguration中&#xff0c;两大核心机制&#xff1a; ● 1. SpringBoot 会自适应处理错误&#xff0c;响应页面或JSON数据 ● 2. SpringMVC的错…

【算法篇】无重复字符的最长子串

无重复字符的最长子串 题目描述&#xff1a;给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的最长子串的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所以其长度为 3。 示例 2: 输入: s “bbbbb” 输出…

深入解析ETL与ELT架构:数据集成技术的演进与发展

摘要&#xff1a;随着大数据时代的到来&#xff0c;数据集成成为企业信息化建设的重要环节。本文将深入探讨ETL与ELT两种架构&#xff0c;分析它们在数据处理、性能、可扩展性等方面的差异&#xff0c;为企业数据集成提供技术指导。 一、引言 在大数据时代&#xff0c;企业需要…

第55集《摄大乘论》

《摄大乘论》&#xff0c;和尚尼慈悲、诸位法师、诸位居士&#xff0c;阿弥陀佛&#xff01;(阿弥陀佛&#xff01;)请大家打开《讲义》第一八四页&#xff0c;癸三、约甚深佛法释。 我们这一科是讲到增上心学&#xff0c;增上心学主要的宗旨&#xff0c;就是我们应该要如何透…

注解 - @RequestHeader

注解简介 在今天的每日一注解中&#xff0c;我们将探讨RequestHeader注解。RequestHeader是Spring框架中的一个注解&#xff0c;用于将HTTP请求头中的值绑定到控制器方法的参数上。 注解定义 RequestHeader注解用于从HTTP请求头中提取值&#xff0c;并将其绑定到控制器方法的…

13- 函数的定义与使用+形参实参区分

13- 函数的定义与使用形参实参区分 文章目录 13- 函数的定义与使用形参实参区分一、函数的定义与使用1.1 函数的结构1. 函数头2. 函数体 1.2 示例代码例子 1&#xff1a;无参数和无返回值的函数例子 2&#xff1a;带参数和返回值的函数 1.3 函数的基本语法1.4 函数的使用示例例…

Faster-RCNN基本思想和网络结构

简单来说&#xff0c;Faster RCNN RPN Fast RCNN RPN 是指 Region Proposal Network&#xff0c;建议区域生成网络。 Faster RCNN 中用 RPN 来代替了 Fast RCNN 中的SS算法。 算法流程&#xff1a; &#xff08;1&#xff09;将图像输入CNN网络得到相应的特征图。 &#x…

多态、虚函数表与动态绑定的深入解析

目录 多态简介 虚函数表与动态绑定 虚函数表 动态绑定机制 内存与性能影响 纯虚函数与抽象类 纯虚函数 抽象类 动态类型转换与typeid操作符 dynamic_cast typeid操作符 虚析构函数的重要性 在面向对象编程中&#xff0c;多态性是一种核心特性&#xff0c;它允许我们…

单机多卡分布式训练策略——MirroredStrategy

前言 分布式训练是一种用于在多个设备或机器上同时训练深度学习模型的技术&#xff0c;它有助于减少训练时间&#xff0c;允许使用更多数据更快训练大模型。分布式训练重点关注数据并行性&#xff0c;本次试验使用的是单机多卡的分布式训练策略&#xff0c;也就是 MirroredStr…

mvn install -DskipTests

mvn install -DskipTests mvn install -DskipTests 不用做测试的打包代码

Task vs Thread

C#中的Task和Thread都是用于实现多线程和并发操作的重要组件&#xff0c;但它们在设计哲学、使用场景和功能特性上存在显著差异&#xff0c;同时也有一些内在的联系。 Task vs Thread 设计理念: Thread: 是操作系统级别的资源&#xff0c;代表了独立的执行路径。它是较为底层…

算法题目学习汇总

1、二叉树前中后序遍历:https://blog.csdn.net/cm15835106905/article/details/124699173 2、输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点&#xff0c;只能调整树中结点指针的指向。 public class Solution {private Tr…

多模态AI的挑战与早期壁垒的构建

伴随着Sora、GPT40的推出&#xff0c;多模态AI逐渐成为研究的热点和应用的趋势。然而&#xff0c;多模态AI的发展并非一帆风顺&#xff0c;它面临着诸多挑战和壁垒。 一、多模态AI的难点 多模态AI的核心在于将不同模态的信息&#xff08;如文本、图像、音频、视频等&#xff…

离线翻译器下载哪个好?这几个翻译器用过的人都说好

面对跨文化交流的挑战&#xff0c;如国际旅行或多元工作环境&#xff0c;语言障碍尤为突出。 特别是在信号弱或无网络覆盖的地区&#xff0c;翻译需求变得更加迫切。此时&#xff0c;一款优质的离线翻译app显得尤为重要。它能够在没有网络支持的情况下提供即时翻译服务&#x…