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

news2025/1/13 13:33:28
加油站

解法1:暴力法。

找到第一个能出发的点,开始往后试。
不需两个for,同步遍历,比较消耗油量与获得油量。
遍历每一个加油站为起点的情况,模拟一圈。
如果跑了一圈,中途没有断油,而且最后油量大于等于0,说明这个起点是ok的。
暴力的方法思路比较简单,但代码写起来也不是很容易,关键是要模拟跑一圈的过程。

for循环适合模拟从头到尾的遍历,而while循环适合模拟环形遍历,要善于使用while!
容易超时。

解法2:查看每个站点的剩余油量。

例子:gas:2 5 2 3 5
cost:1 2 8 2 4
1 3 -6 1 1

例子2: gas:5 8 2 3 5
cost:1 2 8 2 4
4 6 -6 1 1

题目中说明:如果存在解,则 保证 它是 唯一 的,例子2有多个解。

 public int canCompleteCircuit(int[] gas, int[] cost) {
        //  int[] num 可以不用创建新数组。
        int curSum = 0,tolSum = 0,start = 0;

        for (int i = 0; i < gas.length; i++) {
            curSum += gas[i] - cost[i];//
            tolSum += gas[i] - cost[i];//最终剩余油量。
            if (curSum < 0) {
                start = i + 1;
                curSum = 0;
            }
        }
        if (tolSum<0){
            return  -1;
        }
        return start;
    }
分发糖果

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

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

每个孩子至少分配到 1 个糖果。
相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。

解法:现从左往右,在从右往左,选取最大的保留。

  1. 先确定右边评分大于左边的情况(也就是从前向后遍历)

此时局部最优:只要右边评分比左边大,右边的孩子就多一个糖果,全局最优:相邻的孩子中,评分高的右孩子获得比左边孩子更多的糖果

局部最优可以推出全局最优。

  1. 左孩子大于右孩子的情况一定要从后向前遍历。

如果 ratings[i] > ratings[i + 1],此时candyVec[i](第i个小孩的糖果数量)就有两个选择了,一个是candyVec[i + 1] + 1(从右边这个加1得到的糖果数量),一个是candyVec[i](之前比较右孩子大于左孩子得到的糖果数量)。

局部最优:取candyVec[i + 1] + 1 和 candyVec[i] 最大的糖果数量,保证第i个小孩的糖果数量既大于左边的也大于右边的。全局最优:相邻的孩子中,评分高的孩子获得更多的糖果。

 public int candy(int[] ratings) {
        int[] count = new int[ratings.length];//4 2 3 1 在3时再+1,不能用count++;
        Arrays.fill(count,1);
        int sum = 0;
        for (int i = 1; i < ratings.length; i++) {
            if(ratings[i] > ratings[i-1]){
                count[i] = count[i-1] + 1;
            }
        }
        for (int i = ratings.length-2; i >= 0; i--) {
            if (ratings[i]>ratings[i+1]){
                count[i] = Math.max(count[i+1]+1,count[i]);
            }
        }
        for (int i = 0; i < ratings.length; i++) {
            sum += count[i];
        }
        return sum;
    }

柠檬水找零

题目:在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。

每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。

注意,一开始你手头没有任何零钱。

给你一个整数数组 bills ,其中 bills[i] 是第 i 位顾客付的账。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。

解法:用到了hash表和贪心

情况一:账单是5,直接收下。

情况二:账单是10,消耗一个5,增加一个10

情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个5。贪心:优先对10与5的组合找零。

public boolean lemonadeChange(int[] bills) {

        int five = 0;
        int ten = 0;
        int twenty = 0;

        for (int i = 0; i < bills.length; i++) {
            if(bills[i] == 5){
                five++;
            }
            if (bills[i] == 10){
                if (five == 0){
                    return false;
                }
                ten++;
                five--;
            }
            if (bills[i] == 20 ){
                if (ten >0&&five>0){
                    ten--;
                    five--;
                    twenty++;
                }
                else if (five >= 3){
                    five = five - 3;
                    twenty++;
                }
                else {
                    return false;
                }
            }
        }
        return true;
    }

根据身高重建队列

题目:假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。

请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。
解析:不能改变数据,根据它前面有多少人进行排队,还要看是否比它自身高。
先按k排序,在按h排序。
先按h排序,在按k排序。

解法:最后排序方式是在队列的插入进行的。

详细解释

在Java中,Arrays.sort 方法可以接受一个数组和一个比较器(Comparator),用于自定义排序规则。当使用 lambda 表达式来定义比较器时,(a, b) 是 lambda 表达式的参数,它们代表数组中的两个元素,用于比较它们的顺序。
ab 是长度为 2 的数组,分别代表 people 数组中的两个元素,每个元素包含两个整数值:第一个表示身高(hi),第二个表示前面有多少个身高大于或等于他的人(ki)。

people 是要排序的二维整数数组,其中每个元素都是一个整数数组,表示一个人的身高和前面高于或等于其身高的人数。ab 是这个二维数组中的两个元素,它们的形式是 int[2],其中:

  • a[0] 表示第一个人(或元素a)的身高。
  • a[1] 表示第一个人(或元素a)前面高于或等于其身高的人数。

同样地:

  • b[0] 表示第二个人(或元素b)的身高。
  • b[1] 表示第二个人(或元素b)前面高于或等于其身高的人数。

  1. 初始化队列
    • LinkedList<int[]> que = new LinkedList<>(); 创建了一个空的LinkedList,用来存放最终的队列。
  2. 遍历排序后的数组
    • for (int[] p : people) 是一个增强型for循环,它遍历排序后的people数组。
  3. 插入元素
    • que.add(p[1], p); 是插入过程的核心。这里,p是一个长度为2的数组,其中p[0]是身高hp[1]是前面大于等于h的人数k
    • p[1]作为add方法的第一个参数,表示p应该插入到队列中的位置索引。由于LinkedList允许在任意位置插入元素,add(index, element)方法会将element插入到index指定的位置,并将原来的元素以及之后的元素向后移动。
    • 为什么这样插入是正确的?这是因为people数组已经根据身高降序排列,并且对于相同身高的人来说,k值小的在前。所以,对于队列中的每个位置,k值表示了当前人前面应该有多少个比他高或者和他一样高的人。由于队列是从前往后构建的,每次插入时,队列中已经存在的元素都是比当前人高的,或者身高相同但k值更小的,所以直接在k指定的位置插入当前人是正确的。
      假设我们有以下排序后的people数组:

复制

[[7,0], [7,1], [6,1], [5,0], [5,2], [4,4]]

插入过程如下:

  • 对于[7,0]p[1]是0,所以我们将其插入到队列的第0个位置:[[7,0]]
  • 对于[7,1]p[1]是1,所以我们将其插入到队列的第1个位置:[[7,0], [7,1]]
  • 对于[6,1]p[1]是1,但由于队列中已经有2个元素,我们需要将其插入到第1个位置,并且将后面的元素向后移动:[[7,0], [6,1], [7,1]]
  • 对于[5,0]p[1]是0,所以我们将其插入到队列的第0个位置,并将所有其他元素向后移动:[[5,0], [7,0], [6,1], [7,1]]
  • 对于[5,2]p[1]是2,所以我们将其插入到队列的第2个位置:[[5,0], [7,0], [5,2], [6,1], [7,1]]
  • 对于[4,4]p[1]是4,所以我们将其插入到队列的第4个位置:[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]

int[] p 是一个一维数组,它代表了二维数组 people 中的每一个子数组。在这个循环中,p 依次被赋值为 people 中的每一个子数组。
每次迭代,p 就指向 people 中的一个新的子数组,你可以通过 p[0]p[1] 来访问这个子数组的第一个和第二个元素,这些元素分别代表了人的身高和前面高于或等于其身高的人数。
所以,这个增强型for循环实际上是在遍历二维数组的每一行,而不是单个元素。每次循环,p 都是一个指向 people 中一个子数组的引用,而不是一个单独的整数。因此,你可以在 LinkedListadd 方法中使用 p[1] 作为索引,将整个子数组 p 插入到 LinkedList 的正确位置。

public int[][] reconstructQueue(int[][] people) {
        Arrays.sort(people,(a,b)->{
            if (a[0] == b[0]){
                return a[1] - b[1];
            }
            return b[0] - a[0];
        });


        LinkedList<int[]> que = new LinkedList<>();

        for (int[] p:people) {
            que.add(p[1],p);
        }

        return que.toArray(new int[people.length][]);
    }

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

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

相关文章

八、系统托盘与配置面板

没有人会把你变得越来越好&#xff0c;时间和经历只是陪衬。 支撑你变得越来越好的&#xff0c;是你自己坚强的意志、修养、品行、以及不断的反思和经验。 人生最好的贵人&#xff0c;就是努力向上的自己。 一、系统托盘 1、资源文件夹 新建资源文件夹&#xff0c;我们需要把…

uniapp 之 uni-forms校验提示【提交的字段[‘xxx‘]在数据库中并不存在】解决方案

目录 场景问题代码结果问题剖析解决方案 场景 uni-forms官方组件地址 使用uniapp官方提供的组件&#xff0c;某个表单需求&#xff0c;单位性质字段如果是高校&#xff0c;那么工作单位则是高校的下拉选择格式&#xff0c;单位性质如果是其他的类型&#xff0c;工作单位则是手动…

Java面试核心知识4

公平锁与非公平锁 公平锁&#xff08;Fair&#xff09; 加锁前检查是否有排队等待的线程&#xff0c;优先排队等待的线程&#xff0c;先来先得 非公平锁&#xff08;Nonfair&#xff09; 加锁时不考虑排队等待问题&#xff0c;直接尝试获取锁&#xff0c;获取不到自动到队尾…

基于 SSH 的任务调度系统

文末附有完整项目代码 在当今科技飞速发展的时代&#xff0c;任务调度系统的重要性日益凸显。本文将详细介绍一个基于 SSH&#xff08;SpringStruts2Hibernate&#xff09;的任务调度系统的设计与实现。 一、系统概述 本系统旨在改变传统人工任务调度方式&#xff0c;通过计算…

我的128天创作之路:回顾与展望

大家好呀&#xff01;今天来和你们分享一下我的创作历程&#x1f601;。 一、机缘 最开始创作呢&#xff0c;是因为在学习 C 的 STL 时&#xff0c;像 string、list、vector 这些模板可把我折腾得够呛&#xff0c;但也让我学到了超多东西&#xff01;我就想&#xff0c;要是把我…

性能测试工具Jmeter中的FTP脚本开发

FTP文件传输协议是TCP/IP协议组织中的常用协议之一&#xff0c;主要用在internet上双向传输文件。FTP协议具有客户端和服务器端两个部分组成部分&#xff0c;具有上传与下载两种功能。Jmeter也提供了FTP请求的测试支持&#xff0c;实现了上传和下载功能测试。 对于上图的FTP请求…

【C++】string的关系运算与比较分析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;基础知识&#xff1a;C 中的 string 关系运算器1. 关系运算器概述2. 字符串比较的本质 &#x1f4af;代码解析与扩展代码例一&#xff1a;相等比较代码解析输出 代码例二&a…

mysql本地安装和pycharm链接数据库操作

MySQL本地安装和相关操作 Python相关&#xff1a;基础、函数、数据类型、面向、模块。 前端开发&#xff1a;HTML、CSS、JavaScript、jQuery。【静态页面】 Java前端&#xff1b; Python前端&#xff1b; Go前端 -> 【动态页面】直观&#xff1a; 静态&#xff0c;写死了…

深度学习|表示学习|一个神经元可以干什么|02

如是我闻&#xff1a; 如果我们只有一个神经元&#xff08;即一个单一的线性或非线性函数&#xff09;&#xff0c;仍然可以完成一些简单的任务。以下是一个神经元可以实现的功能和应用&#xff1a; 1. 实现简单的线性分类 输入&#xff1a;一组特征向量 x x x 输出&#xff…

HTB:Paper[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 对靶机进行子域…

做一个 简单的Django 《股票自选助手》显示 用akshare 库(A股数据获取)

图&#xff1a; 股票自选助手 这是一个基于 Django 开发的 A 股自选股票信息查看系统。系统使用 akshare 库获取实时股票数据&#xff0c;支持添加、删除和更新股票信息。 功能特点 支持添加自选股票实时显示股票价格和涨跌幅一键更新所有股票数据支持删除不需要的股票使用中…

Unity + Firebase + GoogleSignIn 导入问题

我目前使用 Unity版本&#xff1a;2021.3.33f1 JDK版本为&#xff1a;1.8 Gradle 版本为&#xff1a;6.1.1 Firebase 版本: 9.6.0 Google Sign In 版本为&#xff1a; 1.0.1 问题1 &#xff1a;手机点击登录报错 apk转化成zip&#xff0c;解压&#xff0c;看到/lib/armeabi-v…

Django学习笔记之数据库(一)

文章目录 安装一、数据库配置二、基本操作步骤1.增加2.查看3.排序4.更新5.删除数据 三、一对多&#xff0c;多对多&#xff0c;一对一1.一对多1.一对一1.多对多 四、查询操作五、聚合操作六、F和Q操作 安装 首先就是安装Mysql和Navicat。 一、数据库配置 其实整个就是连接前端…

SpringBoot日常:集成Kafka

文章目录 1、pom.xml文件2、application.yml3、生产者配置类4、消费者配置类5、消息订阅6、生产者发送消息7、测试发送消息 本章内容主要介绍如何在springboot项目对kafka进行整合&#xff0c;最终能达到的效果就是能够在项目中通过配置相关的kafka配置&#xff0c;就能进行消息…

RK3568 Android 13 内置搜狗输入法小计

问&#xff1a;为什么写&#xff1f; 答&#xff1a;网上搜出来的都试过了&#xff0c;不行&#xff01;下面直接上代码和注意事项&#xff01; 首先到这个目录&#xff08;/RK3568/Rockchip_Android13_SDK_Release/device/rockchip/rk356x/tl3568_evm/preinstall&#xff09…

【opencv】第8章 图像轮廓与图像分割修复

8.1 查找并绘制轮廓 一个轮廓一般对应一系列的点&#xff0c;也就是图像中的一条曲线。其表示方法可能 根据不同的情况而有所不同。在OpenCV 中&#xff0c;可以用findContours()函数从二值图 像中查找轮廓 8.1.1 寻找轮廓&#xff1a; findContours() 函数 findContours) 函…

BGP 泄露

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 目录 1. BGP 是什么&#xff1f; 2. 什么是 BGP 泄露&#xff1f; 3. 今天发生了什么&#xff1f; 4. 正常和被劫持状态下的路由示意图 5. 受影响区域 6. 责任在谁&#xff1f; 7. 有办法避免这…

数据结构与算法之二叉树: LeetCode 572. 另一棵树的子树 (Ts版)

另一棵树的子树 https://leetcode.cn/problems/subtree-of-another-tree/description/ 描述 给你两棵二叉树 root 和 subRoot检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false二叉树 tree …

动植物基因表达调控

1&#xff0c; on and off状态 以及表达的量 2&#xff0c; 基因调控的生物学影响&#xff1f; 超过400多种细胞类型&#xff0c;数目上37万亿 不是所有的基因都表达 为什么多核真核细胞需要基因调控&#xff1f; 单个细胞往多个细胞逐渐进化的过程&#xff0c;形成复杂的…

FreePBX 17 on ubuntu24 with Asterisk 20

版本配置&#xff1a; FreePBX 17&#xff08;最新&#xff09; Asterisk 20&#xff08;最新Asterisk 22&#xff0c;但是FreePBX 17最新只支持Asterisk 21&#xff0c;但是21非LTS版本&#xff0c;所以选择Asterisk 20&#xff09; PHP 8.2 Maria DB (v10.11) Node J…