代码随想录day29 | leetcode 134.加油站 135.分发糖果 860.柠檬水找零 406.根据身高重建队列

134.加油站

思路

如果总油量减去总消耗大于等于零那么一定可以跑完一圈,说明 各个站点的加油站 剩油量rest[i]相加一定是大于等于零的。
每个加油站的剩余量rest[i]为gas[i] - cost[i]。
i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。

Java

class Solution {public int jump(int[] nums) {int jumps = 0; // 跳跃次数int curEnd = 0; // 当前跳跃覆盖的最远位置int nextMax = 0; // 下一次跳跃覆盖的最远位置for (int i = 0; i < nums.length - 1; i++) {nextMax = Math.max(nextMax, i + nums[i]); // 更新下一次的最远位置if (i == curEnd) { // 当前跳跃到达了覆盖范围的末尾jumps++; // 增加跳跃次数curEnd = nextMax; // 更新当前覆盖范围if (curEnd >= nums.length - 1) { // 如果已经可以到达终点,提前结束break;}}}return jumps;}
}

关键逻辑

  1. curSum 重置
    • curSum < 0 时,说明从当前起点到当前站点之间的油量不足以到达下一站。
    • 此时假设下一站为新的起点,并将 curSum 重置为 0。
    • 因为问题保证至少有一个解,所以继续累加判断新的起点即可。
  2. totalSum 判断
    • 如果整个环路的总净油量(totalSum)小于 0,则无论从哪里开始,油量都不足以完成一圈。

135.分发糖果

思路

这道题目一定是要确定一边之后,再确定另一边,例如比较每一个孩子的左边,然后再比较右边,如果两边一起考虑一定会顾此失彼。
先确定右边评分大于左边的情况(也就是从前向后遍历)
再确定左孩子大于右孩子的情况(从后向前遍历)

Java

class Solution {public int candy(int[] ratings) {int len = ratings.length;int[] candyVec = new int[len];int result = 0;// 初始化,每个人至少有一个糖果for (int i = 0; i < len; i++) {candyVec[i] = 1;}// 从左往右遍历for (int i = 1; i < len; i++) {if (ratings[i] > ratings[i - 1]) {candyVec[i] = candyVec[i - 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);}}// 累加所有糖果for (int candy : candyVec) {result += candy;}return result;}
}

关键逻辑解析

  1. 左遍历规则
    • 如果当前学生的评分比左边的高,则糖果数应该比左边多 1。
    • 遍历后,保证每个学生的糖果满足“比左边评分高”的条件。
  2. 右遍历规则
    • 如果当前学生的评分比右边高,则糖果数应该比右边多 1。
    • 同时取当前糖果数和(右侧糖果数 + 1)的较大值,确保满足两侧评分的规则。

860.柠檬水找零

思路

只需要维护三种金额的数量,5,10和20。
有如下三种情况:
情况一:账单是5,直接收下。
情况二:账单是10,消耗一个5,增加一个10
情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个5

Java

class Solution {public boolean lemonadeChange(int[] bills) {int five = 0;int ten = 0;for (int i = 0; i < bills.length; i++) {if (bills[i] == 5) {five++;} else if (bills[i] == 10) {five--;ten++;} else if (bills[i] == 20) {if (ten > 0) {ten--;five--;} else {five -= 3;}}if (five < 0 || ten < 0) return false;}return true;}
}

总结

咋眼一看好像很复杂,分析清楚之后,会发现逻辑其实非常固定。
这道题目可以告诉大家,遇到感觉没有思路的题目,可以静下心来把能遇到的情况分析一下,只要分析到具体情况了,一下子就豁然开朗了。
如果一直陷入想从整体上寻找找零方案,就会把自己陷进去,各种情况一交叉,只会越想越复杂了。

406.根据身高重建队列

思路

与135. 分发糖果类似,遇到两个维度权衡的时候,一定要先确定一个维度,再确定另一个维度。
按照身高排序之后,优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。
局部最优:优先按身高高的people的k来插入。插入操作过后的people满足队列属性

Java

class Solution {public int[][] reconstructQueue(int[][] people) {// 身高从大到小排(身高相同k小的站前面)Arrays.sort(people, (a, b) -> {if (a[0] == b[0]) return a[1] - b[1];   //如果身高相同,按 k 值升序排列return b[0] - a[0];   //如果身高不同,按身高降序排列});LinkedList<int[]> que = new LinkedList<>();for (int[] p : people) {que.add(p[1],p);   //将当前元素插入到索引为 p[1] 的位置}return que.toArray(new int[people.length][]);}
}

Lambda 表达式的作用

Lambda 表达式的格式是:

(parameters) -> expression 或 { statements }

它的作用是简化匿名类的写法,用来快速定义函数式接口的实现。对于 Comparator 接口,Lambda 表达式替代了传统的匿名类来定义排序规则。

Lambda 表达式在 Arrays.sort 中的使用

Arrays.sort(people, (a, b) -> { ... }) 是对二维数组 people 进行排序。

  • abpeople 数组中的两个元素(在这里每个元素是一个长度为 2 的数组)。
  • Comparator 接口通过 compare(T o1, T o2) 定义排序规则,这里的 ab 就是 o1o2

代码中的逻辑

Arrays.sort(people, (a, b) -> {if (a[0] == b[0]) return a[1] - b[1];   // 身高相同时,按 k 值升序排列return b[0] - a[0];   // 身高不同,按身高降序排列
});
1. 如果身高相同 (a[0] == b[0]):
return a[1] - b[1];
  • 比较 a[1]b[1] 的大小。
  • a[1] - b[1] > 0 时,b 会排在 a 前面(升序排列)。
  • 简单理解就是 k 值越小的排在前面
2. 如果身高不同 (a[0] != b[0]):
return b[0] - a[0];
  • 比较 b[0]a[0] 的大小。
  • b[0] - a[0] > 0 时,a 会排在 b 前面(降序排列)。
  • 简单理解就是 身高越高的排在前面

Lambda 表达式的展开形式

用传统匿名类实现同样功能:

Arrays.sort(people, new Comparator<int[]>() {@Overridepublic int compare(int[] a, int[] b) {if (a[0] == b[0]) {return a[1] - b[1];}return b[0] - a[0];}
});

可以看到,Lambda 表达式 (a, b) -> {...} 简化了匿名类的写法。


总结

  1. Lambda 表达式语法
    • (a, b) -> 表达式
    • (a, b) -> { 代码块 }
  2. 本例中:
    • ab 是二维数组 people 中的两个元素。
    • a[0]b[0] 是身高,a[1]b[1] 是 k 值。
    • 排序规则:- 先按身高降序排列。
      • 若身高相同,按 k 值升序排列。

比较器的返回值在排序中的含义

在 Java 中,Comparatorcompare 方法返回一个整数,用于定义排序规则:

  • 负值:第一个参数应该排在第二个参数前面。
  • :两个参数在排序中视为相等。
  • 正值:第一个参数应该排在第二个参数后面。

a[1] - b[1] 的作用

假设 ab 是两个数组(例如,a = [h1, k1]b = [h2, k2]),a[1]b[1] 分别表示它们的 k 值。

  1. a[1] < b[1]
    • 计算结果为负值,意味着 a 应该排在 b 的前面。
  2. a[1] > b[1]
    • 计算结果为正值,意味着 b 应该排在 a 的前面。
  3. a[1] == b[1]
    • 计算结果为零,表示 ab 在这个维度上视为相等,排序保持当前顺序(稳定排序)。

因此,return a[1] - b[1] 会让 k 值按升序排列,因为 k 值小的会排在前面。

所以b[0] - a[0]也是同理

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

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

相关文章

【AndroidAPP】权限被拒绝:[android.permission.READ_EXTERNAL_STORAGE],USB设备访问权限系统报错

一、问题原因 1.安卓安全性变更 Android 12 的安全性变更&#xff0c;Google 引入了更严格的 PendingIntent 安全管理&#xff0c;强制要求开发者明确指定 PendingIntent 的可变性&#xff08;Mutable&#xff09;或不可变性&#xff08;Immutable&#xff09;。 但是&#xf…

打印进度条

文章目录 1.Python语言实现(1)黑白色(2)彩色&#xff1a;蓝色 2.C语言实现(1)黑白颜色(2)彩色版&#xff1a;红绿色 1.Python语言实现 (1)黑白色 import sys import timedef progress_bar(percentage, width50):"""打印进度条:param percentage: 当前进度百分比…

ubuntu 使用samba与windows共享文件[注意权限配置]

在Ubuntu上使用Samba服务与Windows系统共享文件&#xff0c;需要正确配置Samba服务以及相应的权限。以下是详细的步骤&#xff1a; 安装Samba 首先&#xff0c;确保你的Ubuntu系统上安装了Samba服务。 sudo apt update sudo apt install samba配置Samba 安装完成后&#xff0c…

数据结构(哈希表)

背景 在对数据的日常处理中&#xff0c;查找是一项基本操作。通常&#xff0c;查找算法都是基于对比的&#xff0c;比如在一条链表中有n个节点&#xff0c;要找到其中的某个节点&#xff0c;最基本的思路就是从头到尾依次遍历每个节点&#xff0c;依次对比每个节点是否是想要的…

【每日学点鸿蒙知识】模拟器开启网络、长时任务、兼容性测试支持、丢帧定位、SO中访问rawfile等

1、模拟器如何开启网络&#xff1f; 模拟器使用的是电脑本身的网络&#xff0c;不通过代理即可访问网络。 2、创建子window后&#xff0c;锁屏很短时间内&#xff0c;应用会被杀死&#xff1f; 没开长时任务&#xff0c;锁屏和退后台保活要开长时任务。 应用退至后台后&…

如何解决Eigen和CUDA版本不匹配引起的错误math_functions.hpp: No such file or directory

Apollo9针对RTX40的docker环境里的Eigen库版本是3.3.4&#xff0c;CUDA是11.8: 编译我们自己封装模型的某些component代码时没问题&#xff0c;编译一个封装occ模型的component代码时始终报错: In file included from /usr/include/eigen3/Eigen/Geometry:11:0, …

Mac连接云服务器工具推荐

文章目录 前言步骤1. 下载2. 安装3. 常用插件安装4. 连接ssh测试5. 连接sftp测试注意&#xff1a;ssh和sftp的区别注意&#xff1a;不同文件传输的区别解决SSL自动退出 前言 Royal TSX是什么&#xff1a; Royal TSX 是一款跨平台的远程桌面和连接管理工具&#xff0c;专为 mac…

python修改ppt中的文字部分及插入图片

批量修改ppt中的某个模块&#xff0c;或者批量制作奖状等场景会用到&#xff1b; import os import pandas as pd from pptx import Presentation from pptx.util import Inchesfilepath/Users/kangyongqing/Documents/kangyq/202303/分析模版/批量制作/file1时段预警_副本.pp…

从0到机器视觉工程师(一):机器视觉工业相机总结

目录 相机的作用 工业相机 工业相机的优点 工业相机的种类 工业相机知名品牌 光源与打光 打光方式 亮暗场照明 亮暗场照明的应用 亮暗场照明的区别 前向光漫射照明 背光照明 背光照明的原理 背光照明的应用 同轴光照明 同轴光照明的应用 总结 相机的作用 相机…

gesp(C++一级)(7)洛谷:B3863:[GESP202309 一级] 小明的幸运数

gesp(C一级)&#xff08;7&#xff09;洛谷&#xff1a;B3863&#xff1a;[GESP202309 一级] 小明的幸运数 题目描述 所有个位数为 k k k 的正整数&#xff0c;以及所有 k k k 的倍数&#xff0c;都被小明称为“ k k k 幸运数”。小明想知道正整数 L L L 和 R R R 之间&a…

风力涡轮机缺陷检测数据集,86.6%准确识别率,11921张图片,支持yolo,PASICAL VOC XML,COCO JSON格式的标注

风力涡轮机缺陷检测数据集&#xff0c;86.6&#xff05;准确识别率&#xff0c;11921张图片&#xff0c;支持yolo&#xff0c;PASICAL VOC XML&#xff0c;COCO JSON格式的标注 数据集下载 yolov11&#xff1a; https://download.csdn.net/download/pbymw8iwm/90206849 yolov…

力扣-数据结构-8【算法学习day.79】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;建议灵神的题单和代码随想录&#xff09;和记录自己的学习过程&#xff0c;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关…

FreeRTOS的内存管理(选择heap4.c文件的理由)

目录 1. 了解FreeRTOS内存管理 2. 了解内存碎片 3.了解各个heap.c的内存分配方法 1.heap1.c 2.heap2.c 3.heap3.c 4.heap4.c 5.heap5.c 总结&#xff1a; 内存管理是一个系统基本组成部分&#xff0c;FreeRTOS 中大量使用到了内存管理&#xff0c;比如创建任务、信号量…

WPF中的Microsoft XAML Behaviors包功能详解

什么是XAML Behaviors(行为) XAML Behaviors 提供了一种简单易用的方法&#xff0c;能以最少的代码为 Windows UWP/WPF 应用程序添加常用和可重复使用的交互性。 但是Microsoft XAML Behaviors包除了提供常用的XAML Behaviors之外&#xff0c;还提供了一些Trigger&#xff08…

一文学习SpringBoot

一、SpringBoot介绍 (一)SpringBoot简介 Spring Boot 是由 Pivotal 团队提供的一个用于简化 Spring 应用初始搭建以及开发过程的框架。它基于 Spring 框架&#xff0c;旨在通过减少配置和简化开发流程来加速应用的开发和部署。Spring Boot 提供了嵌入式的 Tomcat、Jetty 或 Un…

本地小主机安装HomeAssistant开源智能家居平台打造个人AI管家

文章目录 前言1. 添加镜像源2. 部署HomeAssistant3. HA系统初始化配置4. HA系统添加智能设备4.1 添加已发现的设备4.2 添加HACS插件安装设备 5. 安装cpolar内网穿透5.1 配置HA公网地址 6. 配置固定公网地址 前言 大家好&#xff01;今天我要向大家展示如何将一台迷你的香橙派Z…

streamlit、shiny、gradio、fastapi四个web APP平台体验

streamlit、shiny、gradio、fastapi四个web APP平台体验 经常被问的问题就是&#xff1a;web APP平台哪个好&#xff1f;该用哪个&#xff1f;刚开始只有用streamlit和shiny&#xff0c;最近体验了一下gradio和fastapi&#xff0c;今天根据自己的体会尝试着回答一下。 使用R语…

Presto-简单了解-230403

presto是什么了解一下&#xff1a; 秒级查询引擎&#xff08;不做存储&#xff09;&#xff0c;GB-PB级不依赖于yarn&#xff0c;有自己的资源管理和执行计划支持多种数据源&#xff1a;hive、redis、kafka presto架构 presto优缺点 presto优点 内存到内存的传输&#xff0…

VScode 格式化代码空格记录

点击 -> “文件” -> “首选项" -> “设置” -> 按下图操作&#xff1a; 怎么格式化代码空格&#xff0c;先看下&#xff1a; 保存代码后&#xff0c;这代码自动格式化发&#xff0c;如下图&#xff1a; 你可以试试看就即可

HTML5 开关(Toggle Switch)详细讲解

HTML5 开关&#xff08;Toggle Switch&#xff09;详细讲解 1. 任务概述 开关&#xff08;Toggle Switch&#xff09;是一种用于表示二元状态&#xff08;如开/关&#xff09;的用户界面控件。用户可以通过点击开关来切换状态&#xff0c;常见于设置选项、开关功能等场景。 2…