算法打卡day29|贪心算法篇03|Leetcode 1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果

 算法题

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

题目链接:1005.K次取反后最大化的数组和

 大佬视频讲解:K次取反后最大化的数组和视频讲解

 个人思路

思路清晰,因为是取反当然是取越小的负数越好,那么先按绝对值排序。如果是负数就取反,相应取反次数减一,遍历到没有负数后还有取反次数就选绝对值最小的值取反剩下的次数,最后数组和就是最大的,也是局部最优求全局最优的结果,可以用贪心

解法
贪心法

按照贪心法的步骤来解题,步骤为:

  • 第一步:将数组按照绝对值大小从大到小排序
  • 第二步:从前向后遍历,遇到负数将其变为正数,同时K--
  • 第三步:如果K还大于0,那么反复转变数值最小的元素,将K用完
  • 第四步:求和

class Solution {public int largestSumAfterKNegations(int[] nums, int K) {nums = IntStream.of(nums) //创建了一个原始类型 int 的流.boxed()//将流中的int值装箱成Integer对象.sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1))//按绝对值大小排序.mapToInt(Integer::intValue).toArray();//转回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还大于0,那么反复转变数值最小的元素,将K用完if (K % 2 == 1) nums[len - 1] = -nums[len - 1];return Arrays.stream(nums).sum();}
}

时间复杂度:O(n log n);(排序操作的时间复杂度是 n log n)

空间复杂度:O(n);(代码使用了额外的数组来存储排序后的结果)


 Leetcode  134. 加油站

题目链接:134. 加油站

大佬视频讲解:加油站视频讲解

个人思路

首先总油量减去总消耗大于等于零那么一定可以跑完一圈,找起点就从头遍历,油减油耗如果有负数就当前遍历点加1,重新计算,直到遍历完总油耗还是大于0;

解法
贪心法

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

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

i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum,i+1后面如果出现更大的负数,就是更新i,那么起始位置又变成新的i+1了

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

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];if (curSum < 0) {index = (i + 1) % gas.length ; //更换新起点curSum = 0;}}if (totalSum < 0) return -1;return index;}
}

时间复杂度:O(n);(遍历整个数组)

空间复杂度:O(1);(常量级的变量)


 Leetcode  135. 分发糖果

题目链接:135. 分发糖果

大佬视频讲解:分发糖果视频讲解

 个人思路

到底是一起算还是分开计算呢?思路不清晰...

解法
贪心法

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

先确定右边评分大于左边的情况,比较左孩子(从前向后遍历),确定分发糖果的第一个数组

再确定左孩子大于右孩子的情况,比较右孩子(从后向前遍历),对前一个数组优化,比较右孩子增加糖果的同时也要比交上一个数组的糖果值,二者取最大的.

具象化代码步骤就是分两个阶段
         1、起点下标1 从左往右,只要 右边 比 左边 大,右边的糖果=左边 + 1
         2、起点下标 ratings.length - 2 从右往左, 只要左边 比 右边 大,此时 左边的糖果应该 取本身的糖果数(符合比它左边大) 和 右边糖果数 + 1 二者的最大值,这样才符合 它比它左边的大,也比它右边大

class Solution {public int candy(int[] ratings) {int len = ratings.length;int[] candyNums = new int[len];candyNums[0] = 1;//初始化第一个孩子糖果数for (int i = 1; i < len; i++) {//从左往右,比左孩子candyNums[i] = (ratings[i] > ratings[i - 1]) ? candyNums[i - 1] + 1 : 1;}for (int i = len - 2; i >= 0; i--) {//从右往左,比右孩子if (ratings[i] > ratings[i + 1]) {candyNums[i] = Math.max(candyNums[i], candyNums[i + 1] + 1);//取最大糖果数}}int ans = 0;for (int num : candyNums) {//累加和ans += num;}return ans;}
}

时间复杂度:O(n);(遍历两遍整个数组)

空间复杂度:O(n);(暂存数组大小)


 以上是个人的思考反思与总结,若只想根据系列题刷,参考卡哥的网址代码随想录算法官网

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

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

相关文章

QT 二维坐标系显示坐标点及点与点的连线-通过定时器自动添加随机数据点

QT 二维坐标系显示坐标点及点与点的连线-通过定时器自动添加随机数据点 功能介绍头文件C文件运行过程 功能介绍 上面的代码实现了一个简单的 Qt 应用程序&#xff0c;其功能包括&#xff1a; 创建一个 MainWindow 类&#xff0c;继承自 QMainWindow&#xff0c;作为应用程序的…

怎么创建百科人物的词条?百度百科词条创建

百度百科中&#xff0c;创建一个属于自己的词条&#xff0c;不仅是个人荣誉的象征&#xff0c;更是对其生平事迹的官方记录&#xff0c;能够让更多人了解和记住一个人的成就。那么&#xff0c;如何创建一个高质量的百科人物词条呢&#xff1f;本文伯乐网络传媒将详细解答这一问…

007_how_to_start_learning_Matlab学习的启动与加速

Matlab学习的启动与加速 1. 前言 这个专题的Matlab博文系列&#xff0c;来到了传奇的007&#xff0c;我又准备放下技术工作的写作&#xff0c;来一点务虚和规划的内容。 这个系列的开始&#xff0c;也是一个随机发生的小概率事件&#xff0c;本来Python&#xff08;PyQt&…

一文读懂:什么是工单系统?市面上有哪些好用的工单系统?

什么是工单管理系统&#xff1f;工单系统如何帮助企业解决管理问题&#xff1f;市面上有哪些好用的工单管理系统&#xff1f;不同工单管理系统适用于什么企业&#xff1f;工单管理系统如何定价&#xff1f; 5000字长文&#xff0c;我写了整整一天&#xff01;梳理了大家对工单…

Vscode循环弹出窗口输入密码的窗口 ‘s password:

今天使用Vscode&#xff0c;连接远程服务器一直不断的弹出窗口&#xff0c;要求输入密码&#xff0c;导致无法显示远程文件。误以为是产品id没有上传成功&#xff0c;导致服务器内没有commid id对应的文件。参考vscode通过ssh链接服务器卡在downloading with wget,但是处理完仍…

成都欣丰洪泰文化传媒有限公司电商服务的新领军者

在当今电商行业风起云涌的时代&#xff0c;成都欣丰洪泰文化传媒有限公司以其独特的视角和专业的服务&#xff0c;成为业内的佼佼者。专注于电商服务&#xff0c;公司不仅为品牌商提供全方位的电商解决方案&#xff0c;还致力于推动整个行业的发展。 一、电商服务的领航者 成都…

【爬虫基础】第2讲 使用Urllib库创建第一个爬虫程序

Urllib 是 Python 的标准库&#xff0c;它提供了一系列用于处理 URL 的函数和类&#xff0c;包括发送 HTTP 请求、处理 HTTP 响应、解析 URL 等功能。可以使用 urllib 来编写简单的网络爬虫。 request&#xff1a;它是最基本的HTTP请求模块&#xff0c;可以用来模拟发送请求。只…

部署vue+springboot网站到服务器【踩坑总结版】

目录 前言1.购买服务器2.安装xftp和xshell3.打包前端代码&#xff08;vue&#xff09;4.打包后端代码5.nginx6.踩坑 前言 先说下个人基础情况&#xff0c;在此之前从来没有碰过服务器&#xff0c;对服务器可以说是一窍不通。linux命令了解的较为基础&#xff0c;上一次学习还是…

23届嵌入式被裁,有什么好的就业建议?

最近看到了一个提问&#xff0c;原话如下&#xff1a; 本人23届毕业生&#xff0c;就业方向嵌入式软件&#xff0c;坐标深圳&#xff0c;工作3月公司裁员&#xff0c;目前接近12月开始找工作。 boss上投递简历&#xff0c;校招岗&#xff0c;比较有规模的好公司基本已读不回&am…

华为防火墙二层墙(VAN/SVI/单臂路由)

二层墙只能做地址池形式的NAT。 交换机安全策略防火墙二层墙 路由器安全策略防火墙三层墙 交换机的光口是不能直接插线的&#xff0c;光模块&#xff0c;包括进和出 长距离&#xff1a;单模 短距离&#xff1a;多模 防火墙自身的ping流量需要单独配置

docker容器虚拟化-4

文章目录 虚拟化网络单节点容器间通信不同节点容器间通信 虚拟化网络 Network Namespace 是 Linux 内核提供的功能&#xff0c;是实现网络虚拟化的重要功能&#xff0c;它能创建多个隔离的网络空间&#xff0c;它们有独自网络栈信息。不管是虚拟机还是容器&#xff0c;运行的时…

高阶数据结构 <红黑树>

本文已收录至《数据结构(C/C语言)》专栏&#xff01; 作者&#xff1a;ARMCSKGT 目录 前言正文红黑树简介红黑树整体结构红黑树节点的定义红黑树主体类设计红黑树的插入函数情况一&#xff1a;变色情况二&#xff1a;变色旋转单旋情况双旋情况 完整插入代码 关于红黑树红黑树检…