牛客NC392 参加会议的最大数目【中等 贪心+小顶堆 Java/Go/PHP 力扣1353】

题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
题目链接:
https://www.nowcoder.com/practice/4d3151698e33454f98bce1284e553651
https://leetcode.cn/problems/maximum-number-of-events-that-can-be-attended/description/

思路

 贪心+优先级队列

Java代码

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param meetings int整型ArrayList<ArrayList<>>* @return int整型*/public int attendmeetings (ArrayList<ArrayList<Integer>> meetings) {//贪心+优先级队列//力扣1353. 最多可以参加的会议数目    力扣上题目描述的更好int ans = 0, max = -1; //max为最后一个会议的结束时间//按会议结束时间排序PriorityQueue<Integer> q = new PriorityQueue<>(new Comparator<Integer>() {@Overridepublic int compare(Integer a, Integer b) {return a - b;}});// key -> 第 i 天, value -> 第 i 天开始的会议的结束时间Map<Integer, List<Integer>> map = new HashMap<>();for (ArrayList<Integer> e : meetings) {//将开始时间相同的所有会议的结束时间放一起if (!map.containsKey(e.get(0))) {map.put(e.get(0), new ArrayList<>());}map.get(e.get(0)).add(e.get(1));//max为最后一个会议的会议结束时间max = Math.max(e.get(1), max);}// 整体思路就是从1开始到最晚结束时间依次遍历一遍,然后挑选此时间要进行的会议;// 而队列的作用就是存储未进行的会议;挑选的判断条件就是挑选的时间不能小于此时的时间,// 因为队列中存储的是每个会议最晚进行时间,即,结束时间for (int i = 1; i <= max ; i++) {if (map.containsKey(i)) {for (Integer cur : map.get(i)) {q.add(cur);}}while (!q.isEmpty() && q.peek() < i) {q.poll();}if (!q.isEmpty()) {ans++;q.poll();}}return ans;}
}

Go代码

package main/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param meetings int整型二维数组* @return int整型*/
func attendmeetings(meetings [][]int) int {//贪心+优先级队列//自己实现的升序堆,按meetings里的结束时间排序h := Heap{make([]int, 10), 0}lastday := -1 //最后会议结束时间//key: 会议开始是第key天,开始时间的相同的会议的结束时间放同个一list中daymap := map[int][]int{}for _, e := range meetings {start := e[0]end := e[1]_, ok := daymap[start]if !ok {daymap[start] = []int{}}daymap[start] = append(daymap[start], end)if lastday < end {lastday = end}}ans := 0// 整体思路就是从1开始到最晚结束时间依次遍历一遍,然后挑选此时间要进行的会议;// 而队列的作用就是存储未进行的会议;挑选的判断条件就是挑选的时间不能小于此时的时间,// 因为队列中存储的是每个会议最晚进行时间,即,结束时间for i := 1; i <= lastday; i++ {_, ok := daymap[i]if ok {list := daymap[i]for _, v := range list {h.add(v)}}for h.Size > 0 && h.peek() < i {h.remove()}if h.Size > 0 {ans++h.remove()}}return ans
}type Heap struct {Arr  []intSize int
}func (h *Heap) ensure(length int) { //堆的扩容old := len(h.Arr)if old >= length {return}newSize := old + old>>1newArr := make([]int, newSize)for i := 0; i < old; i++ {newArr[i] = h.Arr[i]}h.Arr = newArr
}func (h *Heap) add(x int) { //往堆中添加元素idx := h.Sizeh.ensure(idx + 1)h.Arr[idx] = xh.shiftup(idx)h.Size++
}func (h *Heap) shiftup(idx int) { //堆的上滤base := h.Arr[idx]for idx > 0 {pid := (idx - 1) >> 1parent := h.Arr[pid]if base >= parent {break}h.Arr[idx] = parentidx = pid}h.Arr[idx] = base
}func (h *Heap) peek() int {return h.Arr[0]
}func (h *Heap) remove() int {ans := h.Arr[0]idx := h.Sizeh.Arr[0] = h.Arr[idx-1]h.shiftdown(0)h.Size--return ans
}func (h *Heap) shiftdown(idx int) { //下窜,其实可以不传idx,默认是0,从0下标下窜base := h.Arr[idx]half := h.Size >> 1for idx < half {cidx := idx<<1 + 1right := cidx + 1child := h.Arr[cidx]if right < h.Size && h.Arr[right] < child {cidx = rightchild = h.Arr[right]}if base < child {break}h.Arr[idx] = childidx = cidx}h.Arr[idx] = base
}

PHP代码

<?php/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param meetings int整型二维数组 * @return int整型*/
function attendmeetings( $meetings )
{//贪心+优先级队列$ans = 0;$max = -1; //会议日期最大的那个日期,从每场会议的结束日期里获取$h = new Heap();//key: 会议的开始日期start,value:存结束时间的集合list,相同的start的集合$map = [];foreach ($meetings as $e){$start = $e[0];$end = $e[1];if(!isset($map[$start])){$map[$start] =[];}$map[$start][count($map[$start])] = $end;if($max < $end){$max = $end;}}// 整体思路就是从1开始到最晚结束时间依次遍历一遍,然后挑选此时间要进行的会议;// 而队列的作用就是存储未进行的会议;挑选的判断条件就是挑选的时间不能小于此时的时间,// 因为队列中存储的是每个会议最晚进行时间,即,结束时间for($i=1;$i<=$max;$i++){if(isset($map[$i])){$arr = $map[$i];foreach ($arr as $d){$h->add($d);}}while ($h->size >0 && $h->peek() <$i){$h->remove();}if ($h->size >0){$ans++;$h->remove();}}return $ans;
}class Heap{ //自己的实现的升序堆public $arr;public $size;public function __construct(){//初始化堆for($i=0;$i<10;$i++){$this->arr[$i] =0;}$this->size =0;}public function ensure($cap){ //扩容代码$old = count($this->arr);if($old >=$cap) return;$newsize = $old+$old >>1;$newarr = [];for($i=0;$i<$newsize;$i++){$newarr[$i] =0;if($i<$old){$newarr[$i] = $this->arr[$i];}}$this->arr  =$newarr;}public function add($x){$idx = $this->size;$this->ensure($idx+1);$this->arr[$idx] =$x;$this->shiftup($idx);$this->size++;}public function shiftup($idx){ //上滤$base = $this->arr[$idx];while ($idx >0){$pid = ($idx-1) >> 1; //父id$parent = $this->arr[$pid];if($base >$parent) break;$this->arr[$idx] = $parent;$idx = $pid;}$this->arr[$idx] = $base;}public function peek(){return $this->arr[0];}public function remove(){$ans =$this->arr[0];$curlen = $this->size;$this->arr[0] = $this->arr[$curlen-1];$this->size--;$this->shiftdown(0);return $ans;}//下窜,可以不用传idx参数,一般是从0开始下窜,idx=0public function shiftdown($idx){$base = $this->arr[$idx];$half = $this->size >> 1;while ($idx<$half) {$cidx = ($idx<<1) +1;$right = $cidx+1;$child = $this->arr[$cidx];if($right < $this->size && $child > $this->arr[$right]){$cidx = $right;$child = $this->arr[$right];}if($child > $base) break;$this->arr[$idx] =$child;$idx= $cidx;}$this->arr[$idx] = $base;}
}

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

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

相关文章

java面试高级篇(JVM、Mysql、Redis、Kafka)

文章目录 面试专题-java高级篇1. JVM有做过jvm的调优吗?常用的jvm参数调优有哪些?如果jvm持续一段时间频繁的发生Young GC (轻GC) 可能原因有哪些? 2. Mysql2.1. 基本功(见为知笔记)2.2. 什么是索引2.3. 索引的优劣势2.4. MySQL的索引结构2.4.1. B-Tree索引2.4.2. BTree索引…

外卖系统源码开发全攻略:外卖小程序与后台管理系统的设计与实现

今天&#xff0c;小编将详细介绍外卖系统源码的开发全攻略&#xff0c;从需求分析到设计与实现&#xff0c;为开发者提供全面指导。 一、需求分析 1.用户需求 用户是外卖系统的核心&#xff0c;需满足以下基本需求&#xff1a; -浏览菜单并下单 -实时追踪订单 -多种支付方…

每日一题——博弈论(枚举与暴力)

博弈论 题目描述 运行代码 #include<iostream> #include<vector> using namespace std; int main(){int n;cin >> n;vector<int> d(n,0);for(int i 0;i < n;i){cin >> d[i];}vector<int> in(1000,0);for(int k 1;k<3;k){for(int…

ESP32烧录AT固件并进行MQTT通讯

首先下载AT固件 发布的固件 - ESP32 - — ESP-AT 用户指南 latest 文档 下载烧录工具 下载指导 - ESP32 - — ESP-AT 用户指南 latest 文档 烧录后注意usb的串口是不能发AT指令的 需要用16和17脚 用AT指令确认OK后连WIFI ATCWMODE1 //设置客户端模式 ATCWLAP …

mysql误删后使用binlog恢复数据

1 预期效果 使用 binlog 恢复数据的预期效果是将误删的数据还原到误删之前的状态&#xff0c;以减少或消除数据丢失的影响。通过正确解析和执行 binlog 中的操作记录&#xff0c;可以重新执行误删操作之后的插入、更新或删除操作&#xff0c;从而恢复被误删的数据。 数据恢复&…

Go微服务: Grpc服务注册在Consul的示例(非Go-Micro)

概述 现在&#xff0c;我们使用consul客户端的api来把GRPC服务实现注册到consul上&#xff0c;非Go-Micro的形式其实&#xff0c;consul官方提供了对应的接口调用来实现&#xff0c;golang中的consul/api包对其进行了封装我们使用consul/api来进行展示 目录结构 gitee.com/g…

springboot+mysql在线考试系统-计算机毕业设计源码82584

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对在线考试等问题&#xff0c;对如何通过计算…

Websocket助手

功能介绍 WS助手是WebSocket调试的开发工具&#xff0c;该客户端工具可以帮助开发人员快速连接到测试/生产环境&#xff0c;它可以帮助您监视和分析 Websocket 消息&#xff0c;并在开发过程中解决问题&#xff1b;可以模拟客户端实现与服务器的数据交互&#xff0c;并完成批量…

论文精读:HuggingGPT: Solving AI Tasks with ChatGPT and its Friends in Hugging Face

HuggingGPT: Solving AI Tasks with ChatGPT and its Friends in Hugging Face Status: Reading Author: Dongsheng Li, Kaitao Song, Weiming Lu, Xu Tan, Yongliang Shen, Yueting Zhuang Institution: 微软亚洲研究院&#xff08;Microsoft Research Asia&#xff09;, 浙江…

uniapp 对接 微信App/支付宝App 支付

相关文档&#xff1a;uni.requestPayment(OBJECT) | uni-app官网 示例代码&#xff1a; import qs from qsasync aliPay(){const { provider } await uni.getProvider({ service:payment })if(provider.includes(alipay)){uni.request({url:后端接口地址,data:{ //传参 },suc…

⌈ 传知代码 ⌋ 基于扩散模型的无载体图像隐写术

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

前端---闭包【防抖以及节流】----面试高频!

1.什么闭包 释放闭包 从以上看出&#xff1a;一般函数调用一次会把内部的数据进行清除--但是这种操作却可以一起保留局部作用域的数据 // 优点:1、可以读取函数内部的变量 2、让这些变量始中存在局部作用域当中 2.闭包产生的两种业务场景&#xff1a;防抖、节流 2.1防抖 举…

QGraphicsView实现简易地图16『爆炸效果』

前文链接&#xff1a;QGraphicsView实现简易地图15『测量面积』 一种简单的爆炸波扩散效果 动态演示效果&#xff1a; 静态展示图片&#xff1a; 核心代码&#xff1a; #pragma once #include "../AbstractGeoItem.h" #include "DataStruct/GeoData.h"…

sysbench压测mysql性能测试命令和报告

sysbench压测mysql性能测试命令和报告 一、安装sysbench工具二、创建测试数据库三、基于sysbench构造测试表和测试数据四、数据库性能测试1、数据库读写性能测试2、数据库读性能测试3、数据库删除性能测试4、数据库更新索引字段性能测5、数据库更新非索引字段性能测试6、数据库…

C++ vector类

目录 0.前言 1.vector介绍 2.vector使用 2.1 构造函数(Constructor) 2.1.1. 默认构造函数 (Default Constructor) 2.1.2 填充构造函数 (Fill Constructor) 2.1.3 范围构造函数 (Range Constructor) 2.1.4 拷贝构造函数 (Copy Constructor) 2.2 迭代器(Iterator) 2.2.…

十、通配符和正则表达式

10.1 通配符 通配符是由shell处理的, 它只会出现在 命令的“参数”里。当shell在“参数”中遇到了通配符 时&#xff0c;shell会将其当作路径或文件名去在磁盘上搜寻可能的匹配&#xff1a;若符合要求的匹配存在&#xff0c;则进 行代换(路径扩展)&#xff1b;否则就将该通配…

Qt for android 获取USB设备列表(一)Java方式 获取

简介 QtActivity 作为 Qt 应用程序的入口点&#xff0c;负责启动和配置 Qt 应用程序的信息&#xff0c; 后面我们继承 QtActivity 做自定义控制&#xff0c;了解一下 Activity 生命周期概念&#xff0c; 因为 QtActivity 继承自Android的activity&#xff0c;使用周期函数完成我…

java8新特性——函数式编程详解

目录 一 概述1.1 背景1.2 函数式编程的意义1.3 函数式编程的发展 Lambda表达式1.1 介绍1.2 使用Lambda的好处1.3 Lambda方法1.3.1 Lambda表达式结构1.3.2 Lambda表达式的特征 1.4 Lambda的使用1.4.1 定义函数式接口1.4.2 Lambda表达式实现函数式接口1.4.3 简化Lambda表达式1.4.…

C++学习/复习4--与类相关的概念/默认成员函数/运算符重载/Date类实现案例

一、类和对象 1.本章概要 2.C中的结构体(struct与class) 升级为类 &#xff08;1&#xff09;类及成员函数的两种定义方式 声明与定义分离 &#xff08;2&#xff09;权限 注意1&#xff1a;struct/class在权限上的区别 &#xff08;3&#xff09;封装 &#xff08;4&#x…