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

news2024/12/25 12:25:05

题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
题目链接:
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>() {
            @Override
            public 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  []int
	Size int
}

func (h *Heap) ensure(length int) { //堆的扩容
	old := len(h.Arr)
	if old >= length {
		return
	}

	newSize := old + old>>1
	newArr := 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.Size
	h.ensure(idx + 1)
	h.Arr[idx] = x
	h.shiftup(idx)
	h.Size++
}

func (h *Heap) shiftup(idx int) { //堆的上滤
	base := h.Arr[idx]

	for idx > 0 {
		pid := (idx - 1) >> 1
		parent := h.Arr[pid]

		if base >= parent {
			break
		}

		h.Arr[idx] = parent
		idx = 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.Size
	h.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 >> 1

	for idx < half {
		cidx := idx<<1 + 1
		right := cidx + 1

		child := h.Arr[cidx]

		if right < h.Size && h.Arr[right] < child {
			cidx = right
			child = h.Arr[right]
		}

		if base < child {
			break
		}

		h.Arr[idx] = child
		idx = 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=0
    public 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.coloradmin.cn/o/1692726.html

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

相关文章

纽曼新品X1000:轻巧便携仅重9.9公斤的1度电应急电源

在户外救援行动和应急设备中&#xff0c;电力供应的稳定性和安全性直接影响到救援工作的效率和成功率。在现代救援工作中&#xff0c;常见的光学声波探测仪、通信联络设备、气象检测仪、生命探测仪、照明设备等装备均需有持续的电力供应&#xff0c;才能保障救援工作的有序开展…

一文带你搞懂DiT(Diffusion Transformer)

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接…

Redis 源码学习记录:集合 (set)

无序集合 Redis 源码版本&#xff1a;Redis-6.0.9&#xff0c;本篇文章无序集合的代码均在 intset.h / intset.c 文件中。 Redis 通常使用字典结构保存用户集合数据&#xff0c;字典键存储集合元素&#xff0c;字典值为空。如果一个集合全是整数&#xff0c;则使用字典国语浪费…

java图书电子商务网站的设计与实现源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的图书电子商务网站的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 图书电子商…

pikachu-Unsafe Filedownload

任意点击一个图片进行下载&#xff0c;发现下载的url。 http://127.0.0.1/pikachu/vul/unsafedownload/execdownload.php?filenamekb.png 构造payload&#xff1a; 即可下载 当前页面的源码&#xff0c;可以进行路径穿越来下载一些重要的配置文件来获取信息。 http://127.0.…

《书生·浦语大模型实战营》第一课 学习笔记:书生·浦语大模型全链路开源体系

文章大纲 1. 简介与背景智能聊天机器人与大语言模型目前的开源智能聊天机器人与云上运行模式 2. InternLM2 大模型 简介3. 视频笔记&#xff1a;书生浦语大模型全链路开源体系内容要点从模型到应用典型流程全链路开源体系 4. 论文笔记:InternLM2 Technical Report简介软硬件基础…

光电直读抄表技术详细说明

1.技术简述 光电直读抄表是一种智能化智能计量技术&#xff0c;主要是通过成像原理立即载入电度表里的标值&#xff0c;不用人工干预&#xff0c;大大提升了抄表效率数据可靠性。此项技术是智慧能源不可或缺的一部分&#xff0c;为电力公司的经营管理提供了有力的适用。 2.原…

在winnas中使用docker desktop遇到的问题及解决方法记录

最近在尝试从群晖转向winnas&#xff0c;一些简单的服务依然计划使用docker来部署。群晖的docker简单易用且稳定&#xff0c;在win上使用docker desktop过程中遇到了不少问题&#xff0c;在此记录一下以供后来人参考。 一、安装docker desktop后启动时遇到无法启动docker引擎 …

VMware虚拟机开机卡在Boot Manager

问题情况 虚拟机启动停留在Boot Manager 解决办法1 解决办法2 1、关闭虚拟机&#xff0c;并将其移除 2、找到虚拟机储存位置清除储存数据 3、使用360清除残留数据 4、重启VMware&#xff0c;重新创建虚拟机 关键词&#xff1a; BIOS 蓝色界面

超级初始网络

目录 一、网络发展史 1、独立模式 2、局域网 LAN&#xff08;Local Area Network&#xff09; 3、广域网 WAN (Wide Area Network) 二、网络通信基础 1、IP地址&#xff1a;用于定位主机的网络地址 2、端口号&#xff1a;用于定位主机中的进程 3、网络协议 4、五元组 …

GIT 新建分支和合并分支

文章目录 前言一、新建分支二、切回老分支&#xff0c;保留新分支的更改三、合并分支 前言 本文主要针对以下场景进行介绍&#xff1a; 场景一&#xff1a;创建新的分支 当前分支(dev_1)已经开发完毕&#xff0c;下一期的需求需要在新分支(dev_2)上进行开发&#xff0c;如何创…

Dubbo源码及总结

Springboot整合Dubbo启动解析Bean定义 根据springboot启动原理&#xff0c;会先把启动类下的所有类先进行解析bean定义&#xff0c;所以要先EnableDubbo这个注解&#xff0c;再根据这个注解里面的注解&#xff0c;可以知道import的两个类DubboComponentScanRegistrar和DubboCo…

嵌入式单片机寄存器操作与实现方法

大家好,今天给大家分享一下,单片机中寄存器该如何操作与实现。 “芯片里面的寄存器访问方式一般是: 1.可使用地址访问,2.可使用指令访问,3.不可访问” 第一:挂载到内存地址总线上了的 挂载到内存地址总线上了的,可以使用分配到的地址访问 如下是STM32单片机存储器映像…

hbase版本从1.2升级到2.1 spark读取hive数据写入hbase 批量写入类不存在问题

在hbase1.2版本中&#xff0c;pom.xml中引入hbase-server1.2…0和hbase-client1.2.0就已经可以有如下图的类。但是在hbase2.1.0版本中增加这两个不行。hbase-server2.1.0中没有mapred包&#xff0c;同时mapreduce下就2个类。版本已经不支持。 <dependency><groupId>…

3d全景电商网站搭建为用户的生产力、想象力和创造力插上腾飞的翅膀

为解决用户搭建3D电商网站制作费用高、难度大的困扰&#xff0c;华锐视点隆重推出全新3D电商网站制作编辑器&#xff0c;以全新的设计思维、交互范式和编辑工具&#xff0c;打破传统3D设计的专业界限&#xff0c;为用户的生产力、想象力和创造力插上腾飞的翅膀! 这款创新的3D电…

PGP软件安装文件加密解密签名实践记录

文章目录 环境说明PGP软件安装PGP软件汉化AB电脑新建密钥并互换密钥对称密钥并互换密钥 文件加密和解密A电脑加密B电脑解密 文件签名A电脑签名文件B电脑校验文件修改文件内容校验失败修改文件名称正常校验 环境说明 使用VM虚拟两个win11,进行操作演示 PGP软件安装 PGP软件下…

STM32 CubeMX使用记录

取消DMA中断默认使能 DMA中断默认使能勾选无法取消选中 取消勾选Force DMA channels interrupts

算法入门----小话算法(1)

下面就首先从一些数学问题入手。 Q1&#xff1a; 如何证明时间复杂度O(logN) < O(N) < O(NlogN) < O(N2) < O(2N) < O(N!) < O(NN)? A&#xff1a; 如果一个以整数为参数的不等式不能很容易看出不等的关系&#xff0c;那么最好用图示或者数学归纳法。 很显…

Github 2024-05-24 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-05-24统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目3非开发语言项目2TypeScript项目2JavaScript项目1Kotlin项目1C#项目1C++项目1Shell项目1Microsoft PowerToys: 最大化Windows系统生产…

共享经济中的创新演示:打造案例分析PPT,让想法流动起来

在当今这个看图说话的时代&#xff0c;无论是在职场打拼还是学术殿堂&#xff0c;一份牛气冲天的案例分析PPT无疑是你专业形象的加分项。 不管你是刚出道的小鲜肉&#xff0c;还是已经混迹江湖多年的老鸟&#xff0c;一份有深度、有力度的PPT都能帮你在人群中脱颖而出&#xf…