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

猿创征文|【第11题】求坐上公交的最晚时间(考察贪心算法)

回城传送–》《JAVA筑基100例》

文章目录

  • 零、前言
  • 一、题目描述
  • 二、解题思路
  • 三、代码详解
  • 四、推荐专栏
  • 五、示例源码下载

零、前言

​ 今天是学习 JAVA语言 打卡的第11天,每天我会提供一篇文章供群成员阅读( 不需要订阅付钱 ),读完文章之后,按解题思路,自己再实现一遍。在小虚竹JAVA社区 中对应的 【打卡贴】打卡,今天的任务就算完成了。

​ 因为大家都在一起学习同一篇文章,所以有什么问题都可以在群里问,群里的小伙伴可以迅速地帮到你,一个人可以走得很快,一群人可以走得很远,有一起学习交流的战友,是多么幸运的事情。

​ 学完后,自己写篇学习报告的博客,可以发布到小虚竹JAVA社区 ,供学弟学妹们参考。

​ 我的学习策略很简单,题海策略+ 费曼学习法。如果能把这100题都认认真真自己实现一遍,那意味着 JAVA语言 已经筑基成功了。后面的进阶学习,可以继续跟着我,一起走向架构师之路。

一、题目描述

原题地址–》传送门
题目:
给你一个下标从 0 开始长度为 n 的整数数组 buses ,其中 buses[i] 表示第 i 辆公交车的出发时间。同时给你一个下标从 0 开始长度为 m 的整数数组 passengers ,其中 passengers[j] 表示第 j 位乘客的到达时间。所有公交车出发的时间互不相同,所有乘客到达的时间也互不相同。

给你一个整数 capacity ,表示每辆公交车 最多 能容纳的乘客数目。

每位乘客都会搭乘下一辆有座位的公交车。如果你在 y 时刻到达,公交在 x 时刻出发,满足 y <= x 且公交没有满,那么你可以搭乘这一辆公交。最早 到达的乘客优先上车。

返回你可以搭乘公交车的最晚到达公交站时间。你 不能 跟别的乘客同时刻到达。

注意:数组 buses 和 passengers 不一定是有序的。

示例:
在这里插入图片描述

在这里插入图片描述

二、解题思路

  • 先来了解下,什么是贪心算法:在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。

  • 我们知道所有公交车到达的时间,和所有乘客上车的时间。现在要求自己能坐上车的最晚时间,意味着:自己是可以插队的。。这就是贪心算法的核心思想

  • 这道题不只考察上公交的最晚时间,还要考察能坐上座位。

    • 找到最后一个上车的人,代表着这个人前面都是有上车的。

    • 顺着最后一个人往前面找,可以找到一个空位,答案就出来了。

  • 具体实现思路:

    • 数组 buses 和 passengers 不一定是有序的。所以要先对其进行排序。
    • 模拟乘客上车的过程:遍历公交车,然后遍历乘客上车
    • 当座位满了,或者发车时间到了,这时可得到最后一个上车的乘客
    • 反遍历passengers数组,只要有符合条件的,你插队,就是答案了。

三、代码详解

package com.xiaoxuzhu;

import java.util.Arrays;

/**
 * Description: 求坐上公交的最晚时间(考察贪心算法)
 *
 * @author zenghw
 * @version 1.0
 *
 * <pre>
 * 修改记录:
 * 修改后版本	        修改人		修改日期			修改内容
 * 2022/8/20.1	    zenghw		2022/8/20		    Create
 * </pre>
 * @date 2022/8/20
 */
public class Solution {

    public static void main(String[] args) {
        //公交车出发的时间
        int[] buses = new int[]{20,30,10};
        //乘客上车的时间
        int[] passengers = new int[]{19,13,26,4,25,11,21};
        //座位
        int capacity=2;
        int lastTime = latestTimeCatchTheBus(buses,passengers,capacity);
        System.out.println(lastTime);
    }

        public static int latestTimeCatchTheBus(int[] buses, int[] passengers, int capacity) {
        //数组 buses 和 passengers 不一定是有序的,先排序
            Arrays.sort(buses);
            Arrays.sort(passengers);
            //乘客
            int passengerIndex = 0;
            //空坐位个数
            int emptySeatNum = 0;
            //模拟乘客上车的过程
            //遍历公交车
            for (int buse : buses){
                //模拟乘客上车:乘客还没上完;乘客上车的时间要小于等于公交车出发时间
                for (emptySeatNum = capacity;  passengerIndex < passengers.length && passengers[passengerIndex] <= buse; --emptySeatNum){
                    //上车
                    ++passengerIndex;
                    //坐位满了,这辆车就不让上了
                    if(emptySeatNum <=0 ){
                        break;
                    }
                }
                //最后一个上车的乘客
                --passengerIndex;
            }
            int ans =0;
            if(emptySeatNum > 0){
                // 在发车时到达公交站
                ans=  buses[buses.length - 1];
            }else{
                //你就是上一个上车的乘客
                ans=  passengers[passengerIndex];
            }
            //顺着最后一个人往前面找,可以找到一个空位
            while (passengerIndex >= 0 && passengers[passengerIndex--] == ans){
                --ans; // 往前找没人到达的时刻
            }
            return ans;
        }
}

在这里插入图片描述

四、推荐专栏

《JAVA从零到壹》

《JAVA从零到壹》第七讲:面向对象高级特性

五、示例源码下载

关注下面的公众号,回复筑基+题目号

筑基11

相关文章:

  • 直流有刷电机驱动基于STM32F302R8+X-NUCLEO-IHM07M1(一)
  • Pandas loc与iloc
  • 基于QT的指挥猫猫打架玩耍的小游戏设计
  • K8s的Service详解
  • MyBatis-plus组件学习
  • pgsql执行脚本并传参
  • Vue组件通信(组件的自定义事件、全局事件总线、消息订阅与发布、插槽、props)(八)
  • 【编程题】【Scratch三级】2020.12 躲避恐龙
  • nodejs+vue+elementui在线公益-帮助流浪动物网站python java
  • linux C/C++ socket编程
  • 人工智能·前缀和
  • P27 含并行连结的网络 GoogLeNet / Inception V3
  • D - Index × A(Not Continuous ver.)
  • egret白鹭引擎RES资源管理模块,资源动态加载失效BUG,加载卡死BUG,完整解决方案与超详细调试漏洞过程
  • dart、flutter学习记录
  • 【译】JS基础算法脚本:字符串结尾
  • AHK 中 = 和 == 等比较运算符的用法
  • canvas 五子棋游戏
  • JS数组方法汇总
  • node学习系列之简单文件上传
  • Protobuf3语言指南
  • text-decoration与color属性
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 翻译:Hystrix - How To Use
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 判断客户端类型,Android,iOS,PC
  • 前嗅ForeSpider教程:创建模板
  • 驱动程序原理
  • 线上 python http server profile 实践
  • 用 Swift 编写面向协议的视图
  • 积累各种好的链接
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​flutter 代码混淆
  • #ubuntu# #git# repository git config --global --add safe.directory
  • $.ajax()参数及用法
  • (007)XHTML文档之标题——h1~h6
  • (06)金属布线——为半导体注入生命的连接
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (编译到47%失败)to be deleted
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (学习日记)2024.02.29:UCOSIII第二节
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转载)深入super,看Python如何解决钻石继承难题
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET 发展历程
  • .net(C#)中String.Format如何使用
  • .net开发时的诡异问题,button的onclick事件无效
  • .NET值类型变量“活”在哪?
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • .stream().map与.stream().flatMap的使用
  • @GetMapping和@RequestMapping的区别
  • @property python知乎_Python3基础之:property
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题