代码随想录算法训练营 || 贪心算法 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,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。)以这种方…...
Spring框架面试题
springboot的自动装配原理 主类上的SpringBootApplication存在EnableAutoConfiguration,EnableAutoConfiguration会导入AutoConfigurationImportSelector组件,其AutoConfigurationImportSelector$AutoConfigurationGroup#process()方法会读取当前应用所有…...
纯x86汇编实现的多线程操作系统实践 - 第五章 AP的守护执行
AP的32位保护模式代码的后半部分从0x8001C000开始执行,完成的工作主要有:初始化必要的中断给BSP发送启动成功的消息创建各AP的系统进程创建各AP的用户进程循环显示各AP中用户进程执行的时间比例5.1 初始化中断5.1.1总体初始化各AP调用init_interrupt_fun…...
2023年全国最新高校辅导员精选真题及答案7
百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 71.在北京曾经发现一处战国时期的遗址,从中出土了燕、韩、赵、魏等国铸币3876…...
使用windwow windbg 吃透64位分页内存管理
前言 分页基础概念是操作系统基础知识,网上已经有太多太多了。所以本文记录使用windwow内核调试工具验证理论知识。 具体可以参阅intel volume3的 4.1.1 Four Paging Modes章节。 简而言之:CR0.PG 0表示不开启分页.并且根据CR4各种标志开启不同类别的…...
Java知识复习(五)JVM虚拟机
1、虚拟机的自动内存管理和C/C的区别 C/C开发程序时需要为每一个new操作去写对应的delete/free操作,不容易出现内存泄漏和溢出问题。而Java程序将内存控制权交给了Java虚拟机 2、JVM的运行机制 1、Java程序的具体运行过程如下: Java源文件被编译器编…...
房屋出租管理系统
1. 铺垫 1.1 项目真实开发的过程 上来要做什么???? 有电脑—》配环境(JDK、IDEA、MAVEN……) 这个项目:房屋管理系统 从什么角度出发,第一步做什么?? 架构 …...
2023年全国最新食品安全管理员精选真题及答案6
百分百题库提供食品安全管理员考试试题、食品安全员考试预测题、食品安全管理员考试真题、食品安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 51.制定《中华人民共和国食品安全法》的目的是为了保证食品安全…...
C++中的文件操作
文件操作 所有数据程序运行结束后都会释放通过文件可以将数据持久化头文件文件类型分为两种 文本文件—文件以文本的ASCII码形式存储在计算机中二进制文件—文件以文本的二进制存储在计算机中 操作文件的三大类 ofstream—写操作ifstream—读操作fstream—读写操作 文本文件 写…...
监控生产环境中的机器学习模型
简介 一旦您将机器学习模型部署到生产环境中,很快就会发现工作还没有结束。 在许多方面,旅程才刚刚开始。你怎么知道你的模型的行为是否符合你的预期?下周/月/年,当客户(或欺诈者)行为发生变化并且您的训练…...
15s了解什么是物联网技术
目录 15s了解什么是物联网技术 15s了解什么是物联网技术 什么是物联网技术。 简单地说,物联网就是把所有的物体连接起来,相互作用,形成一个互联互通的网络,这就是物联网。如果说互联网是我们身体的虚拟大脑,那么物联网就是我们身体的感知系统,就像眼睛和耳朵-样,让我们…...
敲出来的真理-mysql备份大全,备份命令,还原命令,定时备份
mysqldump命令全量备份数据全量标准语句格式mysqldump -h主机名 -P端口 -u用户名 -p密码 –database 数据库名 > 文件名.sql 1.备份全部数据库的数据和结构mysqldump -uroot -p123456 -A > /data/mysqlDump/mydb.sql2.备份全部数据库的结构(加 -d 参数&#x…...
ATTCK实战系列-红队评估(一)
from ATT&CK实战系列-红队评估(一) 环境搭建 下载地址:http://vulnstack.qiyuanxuetang.net/vuln/detail/2/ 将三个虚拟机启动起来 除了windows 7那个主机,其他都只设置成仅主机模式 windows 7添加两个网卡,一个是仅主机,一个是NAT …...
学python的第二天---差分
一、改变数组元素(差分)方法一:差分数组map(int,input().split())for b in arr[:n]:print(1 if b else 0,end )方法二:区间合并interval.sort(keylambda x:x[0])二、差分a [0] list(map(int, input().split())) a[n 1:]三、差…...
数据结构入门5-2(数和二叉树)
目录 注: 树的存储结构 1. 双亲表示法 2. 孩子表示法 3. 重要:孩子兄弟法(二叉树表示法) 森林与二叉树的转换 树和森林的遍历 1. 树的遍历 2. 森林的遍历 哈夫曼树及其应用 基本概念 哈夫曼树的构造算法 1. 构造过程 …...
把Redis当作队列来用,到底合适吗?
文章目录 前言从最简单的开始:List 队列发布/订阅模型:Pub/Sub趋于成熟的队列:Stream1) Stream 是否支持「阻塞式」拉取消息?2) Stream 是否支持发布 / 订阅模式?3) 消息处理时异常,Stream 能否保证消息不丢失,重新消费?4) Stream 数据会写入到 RDB 和 AOF 做持久化吗?…...
Python学习-----项目设计1.0(设计思维和ATM环境搭建)
目录 前言: 项目开发流程 MVC设计模式 什么是MVC设计模式? ATM项目要求 ATM项目的环境搭建 前言: 我个人学习Python大概也有一个月了,在这一个月中我发布了许多关于Python的文章,建立了一个Python学习起步的专栏…...
(九)python网络爬虫(理论+实战)——爬虫实战:指定关键词的百度新闻爬取
系列文章目录 (1)python网络爬虫—快速入门(理论+实战)(一) (2)python网络爬虫—快速入门(理论+实战)(二) (3) python网络爬虫—快速入门(理论+实战)(三) (4)python网络爬虫—快速入门(理论+实战)(四) (5)...
数据分析面试、笔试题汇总+解析(六)
(接上篇) 面试题(MySQL篇) 3. 如何提高MySQL的查询速度? 考点解析: 考察面试者对MySQL查询优化的理解 参考答案: (因为这个问题如果回答的详细一点可以写上一整篇,…...
vue3+rust个人博客建站日记3-编写主页
内容 绘制了主页的基本布局设置了封装了header栏组件并设置了全局黑夜模式. 选择一个组件库-Naive UI 如果没有设计能力,又想开发出风格统一的前端页面。就一定要选择一个漂亮的组件库。 本次项目选择使用Naive UI,NaivUI库曾被Vue框架作者尤雨溪推荐…...
前端常考react面试题(持续更新中)
react diff 算法 我们知道React会维护两个虚拟DOM,那么是如何来比较,如何来判断,做出最优的解呢?这就用到了diff算法 diff算法的作用 计算出Virtual DOM中真正变化的部分,并只针对该部分进行原生DOM操作,而…...
C++11多线程编程 二:多线程通信,同步,锁
C11多线程编程 一:多线程概述 C11多线程编程 二:多线程通信,同步,锁 C11多线程编程 三:锁资源管理和条件变量 2.1 多线程的状态及其切换流程分析 线程状态说明: 初始化(Init)&am…...
js——原型和原型链
最近看了很多面试题,看到这个js原型是常考点,于是,我总结了一些该方面的知识点分享给大家,其实原型就是那么一回事,搞明白了就没啥了。结果如下图所示:原型原型又可分为显式原型和隐式原型1.1显式原型显式原…...
[计算机网络(第八版)]第三章 数据链路层(学习笔记)
物理层解决了相邻节点透明传输比特的问题 3.1 数据链路层的几个共同问题 3.1.1 数据链路和帧 链路: 从一个节点到相邻节点的一段物理线路,中间没有任何其他的交换节点 数据链路: 节点间的逻辑通道是把实现控制数据传输的协议的硬件和软件加…...
void在不同场景下的意义
指针一般有三种含义:一是指明数据的位置,体现在指针的值,表示一个地址。二是表示数据类型的大小,例如int指针表示四个字节为一组数据,体现在指针的加减法如何计算。三是表示数据如何被解释,例如float指针和…...
Flume简介
Flume是一个高可用,高可靠,分布式的海量日志采集、聚合和传输的系统,能够有效的收集、聚合、移动大量的日志数据。 优点: 使用Flume采集数据不需要写一行代码,注意是一行代码都不需要,只需要在配置文件中…...
java简单学习
Java 基础语法 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。 对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象ÿ…...
Vue2 组件基础使用、父子组件之间的传值
一、什么是组件如画红框的这些区域都是由vue里的各种组件组成、提高复用信通常一个应用会以一棵嵌套的组件树的形式来组织:例如,你可能会有页头、侧边栏、内容区等组件,每个组件又包含了其它的像导航链接、博文之类的组件。为了能在模板中使用…...
代码随想录算法训练营 || 贪心算法 122 55 45
Day28122.买卖股票的最佳时机II力扣题目链接给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易…...
数据结构基础之栈和队列
目录 前言 1、栈 2、队列 2.1、实现队列 2.2、循环队列 前言 上一篇中我们介绍了数据结构基础中的《动态数组》,本篇我们继续来学习两种基本的数据结构——栈和队列。 1、栈 特点:栈也是一种线性结构,相比数组ÿ…...
交友网站开发功能需求/淘宝运营培训
第一章 NB-IOT介绍 1.1 初次相见NB 大家都知道WiFi(能上网),蓝牙(能传图连接鼠标耳机),ZigBee(工厂内听说过),但是对时下比较火的低功耗广域网络(LPWAN&#…...
福田搭建网站费用/宁波seo优化流程
1. 你新到这家公司,公司上下都讲人事部主管是“老板的人”;人事部主管的权利很大,也很有号召力,你调动不了的人和事他都可以调动得了,你明显的感觉到这位主管对你在这家企业的发展是个“绊脚石”。某天&…...
最新在线免费网站/电脑培训班有哪些科目
为方便完成指定数据表的同步操作,可以采用dblink与merge结合的方法完成。操作环境:此数据库服务器ip为192.168.196.76,有center与branch两个库,一般需要将center的表数据同步到branch,center为源库,branch…...
万网域名中文网站查询/网站seo招聘
初步自学了vim,把一些基础的东西记录下来,方便以后查阅 1、启动 vim example.c vim -R example.c 只读模式 2、在命令模式下 wq 或 x 保存退出 q! 强行退出不保存 w 保存命令 3、普通模式 –> 编辑模式 a , c, i, o, s 4、狂按es…...
用什么软件做购物网站/太原网站关键词排名
在执行Hadoop的创建目录、写数据等情况,可能会出现该异常,而在读文件的时候却不会报错,这主要是由于系统的用户名不同导致的,由于我们进行实际开发的时候都是用Windows操作系统,而编译后的JAVA程序是部署在Linux上的。…...
大连网站排名优化价格/网上教育培训机构哪家好
包括像我这样的初学者的文件操作在内的完整步骤假设您有一个.jsonl文件,如:{"reviewerID": "A2IBPI20UZIR0U", "asin": "1384719342", "reviewerName": "cassandra tu \"Yeah, well, thats…...