代码随想录第34天| 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果

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

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

代码随想录 (programmercarl.com)

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

给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:

  • 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。

重复这个过程恰好 k 次。可以多次选择同一个下标 i 。

以这种方式修改数组后,返回数组 可能的最大和 。

示例 1:

输入:nums = [4,2,3], k = 1
输出:5
解释:选择下标 1 ,nums 变为 [4,-2,3] 。

示例 2:

输入:nums = [3,-1,0,2], k = 3
输出:6
解释:选择下标 (1, 2, 2) ,nums 变为 [3,1,0,2] 。

示例 3:

输入:nums = [2,-3,-1,5,-4], k = 2
输出:13
解释:选择下标 (1, 4) ,nums 变为 [2,3,-1,5,4] 。

提示:

  • 1 <= nums.length <= 104
  • -100 <= nums[i] <= 100
  • 1 <= k <= 104

 第一次贪心:局部最优:绝对值最大的负数变成正数;全局最优:和最大

第二次贪心:局部最优:数值小的正数变成负数;全局最优:和最大

具体步骤:

1、将数组按照绝对值大小从大到小排列

2、遍历数组

3、遇到负数就将负数变为正数,同时k--

4、负数改完了k仍然不为0、

5、将数组末尾的最小的正数值反复变负数又变正数,直到k=0

class Solution {public int largestSumAfterKNegations(int[] nums, int K) {// 将数组按照绝对值大小从大到小排序,注意要按照绝对值的大小nums = IntStream.of(nums)  // 将原始数组转换为 IntStream.boxed()  // 装箱,将基本数据类型转换为包装类型,以便使用 sorted 方法.sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1))  // 按绝对值大小排序.mapToInt(Integer::intValue).toArray();  // 将排序后的 IntStream 转换为 int 数组int len = nums.length;  // 数组长度for (int i = 0; i < len; i++) {// 从前向后遍历,遇到负数将其变为正数,同时 K--if (nums[i] < 0 && K > 0) {nums[i] = -nums[i];  // 将负数变为正数K--;  // K 减一}}// 如果 K 还大于 0,那么反复转变数值最小的元素,直到 K 用完if (K % 2 == 1) nums[len - 1] = -nums[len - 1];  // 如果 K 为奇数,将最后一个元素变为负数return Arrays.stream(nums).sum();  // 返回数组元素的和}
}

134. 加油站 

134. 加油站 - 力扣(LeetCode)

代码随想录 (programmercarl.com)

贪心算法,得这么加油才能跑完全程!LeetCode :134.加油站_哔哩哔哩_bilibili

在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。

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

给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -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 升汽油。
因此,无论怎样,你都不可能绕环路行驶一周。

提示:

  • gas.length == n
  • cost.length == n
  • 1 <= n <= 105
  • 0 <= gas[i], cost[i] <= 104

假设有以下情况:

当汽车从下标为0的位置开始走,当走到下标为3的位置时, 剩余的油不够在这里的消耗,所以没有办法走到尾部,此时从下标为4的位置重新开始走,代码如下:

class Solution {public int canCompleteCircuit(int[] gas, int[] cost) {// 初始化当前累计油量、总累计油量和起始加油站索引int curSum = 0;int totalSum = 0;int index = 0;// 遍历每个加油站for (int i = 0; i < gas.length; i++) {// 计算当前累计油量和总累计油量curSum += gas[i] - cost[i];totalSum += gas[i] - cost[i];// 如果当前累计油量为负,则说明无法从当前加油站出发,更新起始加油站索引,并将当前累计油量重置为0if (curSum < 0) {index = (i + 1);curSum = 0;}}// 如果总累计油量为负,则说明无法绕行一圈,返回-1;否则返回起始加油站索引if (totalSum < 0) return -1;return index;}
}

135. 分发糖果 

135. 分发糖果 - 力扣(LeetCode)

代码随想录 (programmercarl.com)

贪心算法,两者兼顾很容易顾此失彼!LeetCode:135.分发糖果_哔哩哔哩_bilibili

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。

你需要按照以下要求,给这些孩子分发糖果:

  • 每个孩子至少分配到 1 个糖果。
  • 相邻两个孩子评分更高的孩子会获得更多的糖果。

请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。

示例 1:

输入:ratings = [1,0,2]
输出:5
解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。

示例 2:

输入:ratings = [1,2,2]
输出:4
解释:你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。

提示:

  • n == ratings.length
  • 1 <= n <= 2 * 104
  • 0 <= ratings[i] <= 2 * 104

精髓在于不要同时比较左右

先从前向后遍历确定右边评分大于左边的情况,再从后往前遍历确定左边评分大于右边的情况。

从前向后遍历确定右边评分大于左边的情况:

局部最优:右边评分比左边大,右边的孩子就多一颗糖果;全局最优:相邻孩子中,评分高的右孩子比左孩子获得更多的糖果。

 for (int i = 1; i < len; i++) {candyVec[i] = (ratings[i] > ratings[i - 1]) ? candyVec[i - 1] + 1 : 1;}

此时结果如图:

再确定左孩子大于右孩子的情况(从后向前遍历):

// 第二次遍历,从右往左分糖果,只要左边的孩子评分比右边的大,左边的孩子的糖果数应该取本身的糖果数和右边孩子糖果数 + 1 二者的最大值for (int i = len - 2; i >= 0; i--) {if (ratings[i] > ratings[i + 1]) {candyVec[i] = Math.max(candyVec[i], candyVec[i + 1] + 1);}}

综合代码:

class Solution {/*** 分两个阶段* 1、起点下标1 从左往右,只要 右边 比 左边 大,右边的糖果=左边 + 1* 2、起点下标 ratings.length - 2 从右往左, 只要左边 比 右边 大,此时 左边的糖果应该 取本身的糖果数(符合比它左边大) 和 右边糖果数 + 1 二者的最大值,这样才符合 它比它左边的大,也比它右边大*/public int candy(int[] ratings) {int len = ratings.length;  // 计算评分数组的长度int[] candyVec = new int[len];  // 创建一个与评分数组等长的数组,用于存储每个孩子分到的糖果数量candyVec[0] = 1;  // 第一个孩子至少分到一个糖果// 第一次遍历,从左往右分糖果,只要右边的孩子评分比左边的大,右边的孩子糖果数就比左边多1for (int i = 1; i < len; i++) {candyVec[i] = (ratings[i] > ratings[i - 1]) ? candyVec[i - 1] + 1 : 1;}// 第二次遍历,从右往左分糖果,只要左边的孩子评分比右边的大,左边的孩子的糖果数应该取本身的糖果数和右边孩子糖果数 + 1 二者的最大值for (int i = len - 2; i >= 0; i--) {if (ratings[i] > ratings[i + 1]) {candyVec[i] = Math.max(candyVec[i], candyVec[i + 1] + 1);}}// 计算总共需要的糖果数int ans = 0;for (int num : candyVec) {ans += num;}return ans;  // 返回总共需要的糖果数}
}

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

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

相关文章

德兰梅尔:耐高温热销的膜元件亮相2024上海国际生物发酵展

德兰梅尔&#xff1a;耐高温热销的膜元件盛装亮相2024上海国际生物发酵展&#xff0c;8月7-9号上海新国际博览中心与您不见不散&#xff01; 据了解&#xff0c;从成立至今&#xff0c;德兰梅尔一直专注膜技术、膜产品的开发生产。在中国市场上&#xff0c;德兰梅尔刚步入中国…

共享门店模式:一种资源优化的创新合伙人机制

共享门店模式&#xff0c;亦被称为“共享股东”模式&#xff0c;是一种创新的合伙人机制。它运用新颖的思维、方式及系统&#xff0c;吸引并集结拥有资源和能力的人才&#xff0c;共同合作&#xff0c;并使他们转变为门店的分红股东。 这一模式的核心在于门店资源的共享&#x…

题目:学习使用按位或 |

题目&#xff1a;学习使用按位或 | There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about being cheated should leave qui…

(css)el-tag标签,el-select多选框,el-cascader级联选框自定义样式

(css)el-tag标签&#xff0c;el-select多选框&#xff0c;el-cascader级联选框自定义样式 css: :root {--button-color: #065de0; }// 标签 .tagNew {margin-right: 20px;border-radius: 20px; }.el-tag.el-tag--info {background-color: var(--button-color);border-color: v…

字符串匹配算法之BF与KMP算法

目录 BF算法(暴力匹配算法) KMP算法 核心思想&#xff1a; next数组 next数组的优化 BF算法(暴力匹配算法) #include <assert.h> int BF(const char* str, const char* sub) {assert(str ! NULL && sub ! NULL);if (str NULL || sub NULL){return -1;}int…

MySQL学习笔记(二)

1、把查询结果中去除重复记录 2、连接查询 从一张表中单独查询&#xff0c;称为单表查询。emp表和dept表联合起来查询数据&#xff0c;从emp表中取员工名字&#xff0c;从dept表中取部门名字&#xff0c;这种跨表查询&#xff0c;多张表联合起来查询数据&#xff0c;被称为连…

【Java SE】8.1继承和多态

目录 1.继承 1.1为什么需要继承 1.2继承概念 1.3继承的语法 1.4父类成员访问 1.4.1子类中访问父类的成员变量 1.4.2子类中访问父类的成员方法 1.5 super关键字 1.6子类构造方法 1.7 super和this 1.8再谈初始化 1.9 protected关键字 1.10继承方式 1.11 final关键字 …

YOLOv9最新改进系列:YOLOv8融合BoTNet模块,融合CNN+自然语言处理技术的优势,有效提升检测效果!

YOLOv9最新改进系列&#xff1a;YOLOv9融合BoTNet模块&#xff0c;融合CNN自然语言处理技术的优势&#xff0c;有效提升检测效果&#xff01; YOLOv9原文链接戳这里&#xff0c;原文全文翻译请关注B站Ai学术叫叫首er B站全文戳这里&#xff01; 详细的改进教程以及源码&…

解读一个binlog文件的内容

解析一个binlog mysqlbinlog -v mysql-bin.000001 /*!50530 SET SESSION.PSEUDO_SLAVE_MODE1*/; /*!50003 SET OLD_COMPLETION_TYPECOMPLETION_TYPE,COMPLETION_TYPE0*/; DELIMITER /*!*/;# at 4 #240402 17:28:13 server id 4294967295 end_log_pos 123 CRC32 0x64dbff7b …

深入理解计算机系统 家庭作业 2.84

这题没有这个要求所以可以用 ? > : < 这种运算 以下代码用的是位级运算.因为我误解了题意 呜呜呜 想看用判断的代码请自行百度 ((((ux<<9>>9)<<((ux<<1>>24)-127)) - ((uy<<9>>9)<<((uy<<1>>24)-127)))>…

【攻防世界】ics-05(PHP伪协议+代码审计+Linux指令)

首先根据题目提示&#xff0c;进入云平台设备维护中心页面&#xff1a; 页面无异常&#xff0c;检查源代码&#xff1a; 发现注入点 ?page&#xff0c;大致有如下思路&#xff1a;1、SSTI模板引擎漏洞&#xff1b;2、XXS&#xff1b;3、PHP伪协议。 首先尝试SSTI漏洞&#xf…

市场复盘总结 20240408

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率 33% 最常用的…

如何实现docker内部容器之间的端口访问

Docker 的普及促使众多应用迁至其上部署&#xff0c;得益其诸多优势。然而&#xff0c;相较于传统非 Docker 环境中各应用通过 127.0.0.1:端口 即可轻松互访&#xff0c;Docker 容器若未经端口映射&#xff0c;彼此间端口则无法直接相通。是否存在更优方案以应对这一挑战&#…

简单易懂的Metabase入门指南

简单易懂的Metabase入门指南 数据分析在现代企业决策过程中扮演着至关重要的角色。但是&#xff0c;数据分析和可视化工具往往过于复杂&#xff0c;特别是对于非技术人员而言。Metabase是一个开源的数据分析和BI&#xff08;商业智能&#xff09;工具&#xff0c;它以易用性为…

代码审计中应注意的命令执行函数以及命令

目录 1.远程代码执行函数 1.1.php 1.1.1.call_user_func() 和 call_user_func_array() 1.1.2.create_function() 1.1.3.assert() 1.1.4.preg_replace() 1.1.5.array_map(), array_walk(), array_filter() 1.1.6.register_shutdown_function() 和 register_tick_functio…

数据结构__顺序表

概念及结构 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。在数组上完成数据的增删查改 需要用到数组&#xff1a;数组的绝对优势&#xff1a;下标的随机访问&#xff08;因为物理空间连续&#xff09; a[i]等…

NatCross实现NASCAB云可云内网穿透指南

一、简介 1、NAS_CAB介绍 跨平台NAS软件,远程管理照片,影音和文件&#xff0c;无需专用设备,个人版永久免费。官网地址&#xff1a;https://www.nascab.cn/。 2、NatCross介绍 NatCross是内网穿透工具,也是免费的端口映射和DDNS动态域名解析软件。软件从2021年上线以来&…

10.枚举

1.背景及定义 枚举是在JDK1.5以后引入的。 主要用途是&#xff1a; 将一组常量组织起来&#xff0c; 在这之前表示一组常量通常使用定义常量的方式&#xff1a; public static final int RED 1; public static final int GREEN 2; public static final int BLACK 3; 但是…

2005-2023年各省国内生产总值指数分季度数据

2005-2023年各省国内生产总值指数分季度数据 1、时间&#xff1a;2005-2023年 2、来源&#xff1a;国家统计局、各省统计局 3、指标&#xff1a;地区生产总值指数(上年同期100)_累计值(%) 4、范围&#xff1a;31省 5、时间跨度&#xff1a;季度 6、缺失情况&#xff1a;无…

Redis 主从复制、哨兵模式、Cluster集群

目录 一、Redis 主从复制 1、主从复制介绍 2、主从复制的作用 3、主从复制流程&#xff1a; 4、搭建redis主从复制 4.1所有服务器搭建redis数据库 4.2修改Redis配置文件&#xff08;Master节点操作&#xff09; ​4.3修改Redis配置文件&#xff08;slave节点操作&#x…