牛客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>() {
            @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;
    }
}


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《MySQL怎样运行的》—InnoDB数据页结构

在上一篇文章中我们讲了&#xff0c;InnoDB的数据页是InnoDB管理存储空间的基本单位&#xff0c;一个页的大小基本为16kb 那你有没有疑问&#xff0c;就是说这个InnoDB的数据页的结构是什么样的&#xff0c;还有他这些结构分别有那些功能~接下来我们一一讲解 数据页的总览结构…

GPT-4o和GPT-4有什么区别?我们还需要付费开通GPT-4?

GPT-4o 是 OpenAI 最新推出的大模型&#xff0c;有它的独特之处。那么GPT-4o 与 GPT-4 之间的主要区别具体有哪些呢&#xff1f;今天我们就来聊聊这个问题。 目前来看&#xff0c;主要是下面几个差异。 响应速度 GPT-4o 的一个显著优势是其处理速度。它能够更快地回应用户的查…

java中的Collections类+可变参数

一、概述 Collections类是集合类的工具类&#xff0c;与数组的工具类Arrays类似 二、可变参数(变&#xff1a;数量) 格式&#xff1a;参数类型名...参数&#xff0c;可变参数就是一个数组 注意&#xff1a;可变参数必须放在参数列表的最后并且一个参数列表只能有一个可变参…

Golang | Leetcode Golang题解之第101题对称二叉树

题目&#xff1a; 题解&#xff1a; func isSymmetric(root *TreeNode) bool {u, v : root, rootq : []*TreeNode{}q append(q, u)q append(q, v)for len(q) > 0 {u, v q[0], q[1]q q[2:]if u nil && v nil {continue}if u nil || v nil {return false}if …

conda 环境找不到 libnsl.so.1

安装prokka后运行报错 perl: error while loading shared libraries: libnsl.so.1: cannot open shared object file: No such file or directory 通过conda list 可以看到 有libsnl 2.00版本&#xff0c;通过修改软链接方式进行欺骗

Vue3项目练习详细步骤(第一部分:项目构建,登录注册页面)

项目环境准备 工程创建 安装依赖 项目调整 注册功能 页面结构 接口文档 数据绑定和校验 数据接口调用 解决跨域问题 登录功能 接口文档 数据绑定和校验 数据接口调用 优化登录/注册成功提示框 项目演示 项目的后端接口参考&#xff1a;https://blog.csdn.net/daf…

selenium 学习笔记(一)

pip的安装 新建一个txt curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py 把上面的代码复制进去后&#xff0c;把后缀名改为.bat然后双击运行 当前目录会出现一个这个文件 然后在命令行pyhon get-pip.py等它下好就可以了selenium安装 需要安装到工程目…

第15章-超声波避障功能 HC-SR04超声波测距模块详解STM32超声波测距

这个是全网最详细的STM32项目教学视频。 第一篇在这里: 视频在这里 STM32智能小车V3-STM32入门教程-openmv与STM32循迹小车-stm32f103c8t6-电赛 嵌入式学习 PID控制算法 编码器电机 跟随 15.1-超声波测距 完成超声波测距功能、测量数据显示在OLED屏幕上 硬件介绍 使用&#…

react 保持组件纯粹

部分 JavaScript 函数是 纯粹 的&#xff0c;这类函数通常被称为纯函数。纯函数仅执行计算操作&#xff0c;不做其他操作。你可以通过将组件按纯函数严格编写&#xff0c;以避免一些随着代码库的增长而出现的、令人困扰的 bug 以及不可预测的行为。但为了获得这些好处&#xff…

【问题解决】huggingface 离线模型下载

问题 因业务需要在本机测试embedding分词模型&#xff0c;使用 huggingface上的transformers 加载模型时&#xff0c;因为网络无法访问&#xff0c;不能从 huggingface 平台下载模型并加载出现如下错误。 下面提供几种模型下载办法 解决 有三种方式下载模型&#xff0c;一种是通…

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

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

苹果手机数据不慎删除?这4个方法果粉必看!

苹果手机该怎么恢复丢失的数据呢&#xff1f;有时候会因为使用不当或者是被他人误删等原因&#xff0c;导致重要的数据丢失&#xff0c;这时我们需要找回丢失手机数据&#xff0c;小编给大家分享4种恢复苹果手机数据的技巧&#xff0c;大家赶紧来学一学吧&#xff01; 一、iclo…

618有哪些值得买的好物?这几款好物通宵整理吐血推荐!

随着618购物节越来越近&#xff0c;很多买家终于等到了用好价钱买好东西的好机会。不管是你一直想要的家居电器&#xff0c;还是最新的数码产品&#xff0c;平时挺贵的东西在618期间会便宜不少。不过&#xff0c;这么多东西可选&#xff0c;促销活动也多得让人看花了眼&#xf…

SAM遥感图像处理开源新SOTA!在GPU上实现40倍加速,不损准确性

在遥感图像处理领域&#xff0c;通过SAM捕捉复杂图像特征和细微差异&#xff0c;可以实现高精度的图像分割&#xff0c;提升遥感数据的处理效率。这种高度的准确性让SAM遥感展现出了比传统方法更优越的性能。 不仅如此&#xff0c;这种策略灵活普适的特性还能拓展遥感技术的应…

Python | Leetcode Python题解之第102题二叉树的层序遍历

题目&#xff1a; 题解&#xff1a; class Solution:def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:if not root: return []res, queue [], collections.deque()queue.append(root)while queue:tmp []for _ in range(len(queue)):node queue.popl…

Unity3D让BoxCollider根据子物体生成自适应大小

系列文章目录 unity工具 文章目录 系列文章目录unity工具 &#x1f449;前言&#x1f449;一、编辑器添加&#x1f449;二、代码动态添加的方法(第一种)&#x1f449;三、代码动态添加的方法(第二种)&#x1f449;四、重新设置模型的中心点&#x1f449;壁纸分享&#x1f449;…

分布式事务解决方案(最终一致性【可靠消息解决方案】)

可靠消息最终一致性解决方案 可靠消息最终一致性分布式事务解决方案指的是事务的发起方执行完本地事务之后&#xff0c;发出一条消息&#xff0c;事务的参与方&#xff0c;也就是消息的消费者一定能够接收到这条消息并且处理完成&#xff0c;这个方案强调的是只要事务发起方将消…

03 FreeRTOS 同步互斥与通信

1、同步与互斥 一句话理解同步与互斥&#xff1a;我等你用完厕所&#xff0c;我再用厕所。 什么叫同步&#xff1f;就是&#xff1a;哎哎哎&#xff0c;我正在用厕所&#xff0c;你等会。 什么叫互斥&#xff1f;就是&#xff1a;哎哎哎&#xff0c;我正在用厕所&#xff0c;你…

太阳能语音监控杆(球机LED款)有什么用

传统监控设备依赖电力支持&#xff0c;在偏远地区和没有网络地区难以发挥其作用&#xff0c;而鼎跃安全的太阳能语音监控杆&#xff08;球机LED款&#xff09;在传统监控基础上&#xff0c;进行了全面优化&#xff0c;解决了无电无网区域使用受限的问题。 太阳能语音监控杆&am…

关于已配好java环境但双击无法打开jar包的解决方案

如果你已经装好了 java 环境直接跳到最后看解决方法即可 先说一下你安装的 java 环境&#xff0c;如果完全是默认选项安装&#xff0c;则会安装 jdk 和 jre&#xff0c;并且在安装 jre 时还需要安装目录下为空&#xff0c;其实 jre 的安装是多余的&#xff0c;因为安装的 jdk 里…