当前位置: 首页 > news >正文

代码随想录算法训练营 || 贪心算法 1005 134 135

Day29

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

力扣题目链接

  • 给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。)

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

  • 输入:A = [2,-3,-1,5,-4], K = 2

  • 输出:13

  • 解释:选择索引 (1, 4) ,然后 A 变为 [2,3,-1,5,4]。

思路

  • 我们可以先把数组按照绝对值从大到小进行排序

  • [5,-4,-3,2,-1],对这个数组,从前往后进行遍历,遇到负数就变为相反数,并把k--;循环结束条件是遍历到数组末尾或k=0

  • 如果k=0跳出循环,那就可以直接返回改变后数组的和

  • 如果数组遍历结束跳出循环,这时k还大于零

  • 如果k是偶数,那其实不用管了,取反两次还是自己

  • 如果k是奇数,就把数组最后一位的元素取反,因为它的绝对值最小,取反后让sum变小的最少

代码

class Solution {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 && k > 0; i++) {//循环结束条件是遍历结束或k为0了if (nums[i] < 0) {nums[i] = -nums[i];//把绝对值最大的负数取反k--;//处理k}}if (k % 2 == 1) nums[nums.length - 1] = -nums[nums.length - 1];//k为偶数不用管,为奇数就把绝对值最小的正数取反return Arrays.stream(nums).sum();}
}

134. 加油站

力扣题目链接

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

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

如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。

思路

  • 暴力遍历

  • 计算gas和cost数组的差数组,对这个arr进行遍历

  • 如果arr[i]小于0,那直接continue,这个加油站的油跑不到下一个加油站(能跑到上一个加油站么,不需要考虑,因为可以看上一个加油站能不能跑到这个加油站)

  • 如果大于0,那就从这里开始循环,跑一圈(取余操作),如果跑的过程中haveGas小于零,那从这个加油站开始就跑不了一圈,结束内层循环;如果发现能跑一圈,那直接返回i

  • 最后外层循环结束,每个加油站都看完了还没有找到能跑一圈的,返回-1;

  • 比较巧妙的解法

  • 还是先给出rest数组

  • 对rest数组进行遍历,计算数组前i个元素的和,并计算部分和的最小值

  • 如果遍历结束,数组所有元素和加起来小于0,说明肯定跑不到,返回-1

  • 如果部分和的最小值都大于零,那随便跑,返回0

  • 剩下的情况就是要研究从哪个加油站开始跑的,我们这时倒着开始遍历,找恰好能填平最小部分和的元素位置

  • 贪心算法

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

  • 首先需要知道,rest数组累加如果不小于0,那就一定能跑玩

  • 对rest数组进行遍历,计算部分和,如果发现计算到i,部分和为负数,那其实从0到i这一段,不可能能作为起点,那就从i+1开始继续计算部分和,部分和从0开始重新计算

  • 如果遍历结束,累加小于0,跑不完返回-1

  • 否则一定能跑完,其实就是部分和大于零的初始值,用index进行记录

代码

class Solution {public int canCompleteCircuit(int[] gas, int[] cost) {int[] arr = new int[cost.length];for (int i = 0; i < arr.length; i++) {arr[i] = gas[i] - cost[i];//计算arr数组}for (int i = 0; i < cost.length; i++){if (arr[i] < 0) continue;//小于0,跑不到下一个加油站,直接continueint index = i;//记录iint haveGas = arr[i];//记录这个加油站的油量while (haveGas >= 0){//haveGas小于零了,说明跑不够一圈,进行下一次外层循环index = (index + 1) % arr.length;//注意是循环,最后一位的下一位是第一位haveGas += arr[index];//不断更新油量,可能多也可能少if (index == i) return i;//如果跑了一圈了,直接返回i}}return -1;//外层循环结束了都没有返回,返回-1}
}class Solution {public int canCompleteCircuit(int[] gas, int[] cost) {int[] rest = new int[gas.length];int sum = 0;int min = 0;for (int i = 0; i < rest.length; i++) {rest[i] = gas[i] - cost[i];sum += rest[i];//计算部分和min = Math.min(min,sum);//计算最小部分和}if (sum < 0) return -1;//油量不够耗油量,肯定跑不完,这里其实是剪枝操作,这一步也可以省去,填不平就返回-1if (min == 0) return 0;//最小部分和是0.没更新过,那随便跑for (int i = rest.length - 1; i >= 0;i--){//倒着遍历min += rest[i];//不断加上油量if (min >= 0) return i;//恰好填平,返回i}return -1;//其实不会执行到这里,但还是要返回,因为只要sum >= 0,就一定有办法让跑完}
}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 = curSum + gas[i] - cost[i];totalSum = totalSum + gas[i] - cost[i];if (curSum < 0){//部分和小于零curSum = 0;//从0开始重新计算index = i + 1;//index从i+1开始}}if (totalSum < 0) return -1;//数组加和小于零一定跑不完,否则一定跑的完return index;//从index开始能跑完}
}

135. 分发糖果

力扣题目链接

老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。

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

  • 每个孩子至少分配到 1 个糖果。

  • 相邻的孩子中,评分高的孩子必须获得更多的糖果。

那么这样下来,老师至少需要准备多少颗糖果呢?

示例 1:

  • 输入: [1,0,2]

  • 输出: 5

  • 解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。

示例 2:

  • 输入: [1,2,2]

  • 输出: 4

  • 解释: 你可以分别给这三个孩子分发 1、2、1 颗糖果。第三个孩子只得到 1 颗糖果,这已满足上述两个条件。

思路

  • 需要遍历两次,一次不好考虑

  • 先从左向右遍历,如果右边比左边分高,那就是左边的糖果+1,其他情况都给一个糖果

  • 然后从右向左遍历,如果左边比右边分高,那就要更新糖果,取原来的和右边糖果+1最大的(注意一定要取最大的)

  • 最后计算数组元素的和即可

代码

class Solution {public int candy(int[] ratings) {int[] candyVec = new int[ratings.length];for (int i = 0; i < ratings.length; i++){//从左向右遍历if (i > 0 && ratings[i] > ratings[i - 1])//比左边大candyVec[i] = candyVec[i - 1] + 1;//左边的+1else {candyVec[i] = 1;//其他情况都给1个糖果}}for (int i = ratings.length - 1; i >= 0; i--){//从右向左遍历if (i < ratings.length - 1 && ratings[i] > ratings[i + 1])//比右边大candyVec[i] = Math.max(candyVec[i],candyVec[i + 1] + 1);//取原来的和右边糖果数+1更大的}int sum = 0;for (int candy : candyVec){sum += candy;}return sum;//返回candyVec数组元素的和}
}

相关文章:

代码随想录算法训练营 || 贪心算法 1005 134 135

Day291005.K次取反后最大化的数组和力扣题目链接给定一个整数数组 A&#xff0c;我们只能用以下方法修改该数组&#xff1a;我们选择某个索引 i 并将 A[i] 替换为 -A[i]&#xff0c;然后总共重复这个过程 K 次。&#xff08;我们可以多次选择同一个索引 i。&#xff09;以这种方…...

Spring框架面试题

springboot的自动装配原理 主类上的SpringBootApplication存在EnableAutoConfiguration&#xff0c;EnableAutoConfiguration会导入AutoConfigurationImportSelector组件&#xff0c;其AutoConfigurationImportSelector$AutoConfigurationGroup#process()方法会读取当前应用所有…...

纯x86汇编实现的多线程操作系统实践 - 第五章 AP的守护执行

AP的32位保护模式代码的后半部分从0x8001C000开始执行&#xff0c;完成的工作主要有&#xff1a;初始化必要的中断给BSP发送启动成功的消息创建各AP的系统进程创建各AP的用户进程循环显示各AP中用户进程执行的时间比例5.1 初始化中断5.1.1总体初始化各AP调用init_interrupt_fun…...

2023年全国最新高校辅导员精选真题及答案7

百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 71.在北京曾经发现一处战国时期的遗址&#xff0c;从中出土了燕、韩、赵、魏等国铸币3876…...

使用windwow windbg 吃透64位分页内存管理

前言 分页基础概念是操作系统基础知识&#xff0c;网上已经有太多太多了。所以本文记录使用windwow内核调试工具验证理论知识。 具体可以参阅intel volume3的 4.1.1 Four Paging Modes章节。 简而言之&#xff1a;CR0.PG 0表示不开启分页.并且根据CR4各种标志开启不同类别的…...

Java知识复习(五)JVM虚拟机

1、虚拟机的自动内存管理和C/C的区别 C/C开发程序时需要为每一个new操作去写对应的delete/free操作&#xff0c;不容易出现内存泄漏和溢出问题。而Java程序将内存控制权交给了Java虚拟机 2、JVM的运行机制 1、Java程序的具体运行过程如下&#xff1a; Java源文件被编译器编…...

房屋出租管理系统

1. 铺垫 1.1 项目真实开发的过程 上来要做什么&#xff1f;&#xff1f;&#xff1f;&#xff1f; 有电脑—》配环境&#xff08;JDK、IDEA、MAVEN……&#xff09; 这个项目&#xff1a;房屋管理系统 从什么角度出发&#xff0c;第一步做什么&#xff1f;&#xff1f; 架构 …...

2023年全国最新食品安全管理员精选真题及答案6

百分百题库提供食品安全管理员考试试题、食品安全员考试预测题、食品安全管理员考试真题、食品安全员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 51.制定《中华人民共和国食品安全法》的目的是为了保证食品安全&#xf…...

C++中的文件操作

文件操作 所有数据程序运行结束后都会释放通过文件可以将数据持久化头文件文件类型分为两种 文本文件—文件以文本的ASCII码形式存储在计算机中二进制文件—文件以文本的二进制存储在计算机中 操作文件的三大类 ofstream—写操作ifstream—读操作fstream—读写操作 文本文件 写…...

监控生产环境中的机器学习模型

简介 一旦您将机器学习模型部署到生产环境中&#xff0c;很快就会发现工作还没有结束。 在许多方面&#xff0c;旅程才刚刚开始。你怎么知道你的模型的行为是否符合你的预期&#xff1f;下周/月/年&#xff0c;当客户&#xff08;或欺诈者&#xff09;行为发生变化并且您的训练…...

15s了解什么是物联网技术

目录 15s了解什么是物联网技术 15s了解什么是物联网技术 什么是物联网技术。 简单地说,物联网就是把所有的物体连接起来,相互作用,形成一个互联互通的网络,这就是物联网。如果说互联网是我们身体的虚拟大脑,那么物联网就是我们身体的感知系统,就像眼睛和耳朵-样,让我们…...

敲出来的真理-mysql备份大全,备份命令,还原命令,定时备份

mysqldump命令全量备份数据全量标准语句格式mysqldump -h主机名 -P端口 -u用户名 -p密码 –database 数据库名 > 文件名.sql 1.备份全部数据库的数据和结构mysqldump -uroot -p123456 -A > /data/mysqlDump/mydb.sql2.备份全部数据库的结构&#xff08;加 -d 参数&#x…...

ATTCK实战系列-红队评估(一)

from ATT&CK实战系列-红队评估(一) 环境搭建 下载地址:http://vulnstack.qiyuanxuetang.net/vuln/detail/2/ 将三个虚拟机启动起来 除了windows 7那个主机&#xff0c;其他都只设置成仅主机模式 windows 7添加两个网卡&#xff0c;一个是仅主机&#xff0c;一个是NAT …...

学python的第二天---差分

一、改变数组元素&#xff08;差分&#xff09;方法一&#xff1a;差分数组map(int,input().split())for b in arr[:n]:print(1 if b else 0,end )方法二&#xff1a;区间合并interval.sort(keylambda x:x[0])二、差分a [0] list(map(int, input().split())) a[n 1:]三、差…...

数据结构入门5-2(数和二叉树)

目录 注&#xff1a; 树的存储结构 1. 双亲表示法 2. 孩子表示法 3. 重要&#xff1a;孩子兄弟法&#xff08;二叉树表示法&#xff09; 森林与二叉树的转换 树和森林的遍历 1. 树的遍历 2. 森林的遍历 哈夫曼树及其应用 基本概念 哈夫曼树的构造算法 1. 构造过程 …...

把Redis当作队列来用,到底合适吗?

文章目录 前言从最简单的开始:List 队列发布/订阅模型:Pub/Sub趋于成熟的队列:Stream1) Stream 是否支持「阻塞式」拉取消息?2) Stream 是否支持发布 / 订阅模式?3) 消息处理时异常,Stream 能否保证消息不丢失,重新消费?4) Stream 数据会写入到 RDB 和 AOF 做持久化吗?…...

Python学习-----项目设计1.0(设计思维和ATM环境搭建)

目录 前言&#xff1a; 项目开发流程 MVC设计模式 什么是MVC设计模式&#xff1f; ATM项目要求 ATM项目的环境搭建 前言&#xff1a; 我个人学习Python大概也有一个月了&#xff0c;在这一个月中我发布了许多关于Python的文章&#xff0c;建立了一个Python学习起步的专栏…...

(九)python网络爬虫(理论+实战)——爬虫实战:指定关键词的百度新闻爬取

系列文章目录 (1)python网络爬虫—快速入门(理论+实战)(一) (2)python网络爬虫—快速入门(理论+实战)(二) (3) python网络爬虫—快速入门(理论+实战)(三) (4)python网络爬虫—快速入门(理论+实战)(四) (5)...

数据分析面试、笔试题汇总+解析(六)

&#xff08;接上篇&#xff09; 面试题&#xff08;MySQL篇&#xff09; 3. 如何提高MySQL的查询速度&#xff1f; 考点解析&#xff1a; 考察面试者对MySQL查询优化的理解 参考答案&#xff1a; &#xff08;因为这个问题如果回答的详细一点可以写上一整篇&#xff0c;…...

vue3+rust个人博客建站日记3-编写主页

内容 绘制了主页的基本布局设置了封装了header栏组件并设置了全局黑夜模式. 选择一个组件库-Naive UI 如果没有设计能力&#xff0c;又想开发出风格统一的前端页面。就一定要选择一个漂亮的组件库。 本次项目选择使用Naive UI&#xff0c;NaivUI库曾被Vue框架作者尤雨溪推荐…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...