[贪心算法]BM96 主持人调度(二)

一、题目

牛客题目链接:主持人调度(二)_牛客题霸_牛客网

题目描述

有 n 个活动即将举办,每个活动都有开始时间与活动的结束时间,第 i 个活动的开始时间是 s t a r t i start_i starti ,第 i 个活动的结束时间是 e n d i end_i endi ,举办某个活动就需要为该活动准备一个活动主持人。
一位活动主持人在同一时间只能参与一个活动。并且活动主持人需要全程参与活动,换句话说,一个主持人参与了第 i 个活动,那么该主持人在 ( s t a r t i start_i starti, e n d i end_i endi) 这个时间段不能参与其他任何活动。求为了成功举办这 n 个活动,最少需要多少名主持人。

数据范围: 1≤n≤ 1 0 5 10^{5} 105 , − 2 32 2^{32} 232 s t a r t i start_i starti e n d i end_i endi 2 31 2^{31} 231−1

复杂度要求:时间复杂度 O(nlog⁡n),空间复杂度 O(n)

示例1
输入:2,[[1,2],[2,3]]
返回值:1
说明:只需要一个主持人就能成功举办这两个活动
示例2
输入:2,[[1,3],[2,4]]
返回值:2
说明:需要两个主持人才能成功举办这两个活动

备注:

1≤n≤ 1 0 5 10^{5} 105
s t a r t i start_i starti, e n d i end_i endi在int范围内

二、解题思路&代码实现

方案一:排序+遍历比较(推荐使用)

解题思路:

通过分析得知如果活动无交集就可共用同一个主持人,所以本题本质是求N 个活动中有多少个活动有交集,有交集的活动不能共用主持人,典型的贪心算法。

具体实现:
  • step 1:利用辅助数组获取单独各个活动开始的时间和结束时间,然后分别开始时间和结束时间进行排序,方便后面判断是否相交。
  • step 2: 遍历n个活动,如果某个活动开始的时间大于之前活动结束的时候,说明活动不想交,不需要增加主持人。
  • step 3: 若是出现之前活动结束时间晚于当前活动开始时间的,则需要增加主持人。
复杂度分析:

时间复杂度:O( n l o g 2 nlog_2 nlog2n),遍历都是O(n),sort排序为
O( n l o g 2 nlog_2 nlog2n)
空间复杂度:O(n),辅助空间记录开始时间和结束时间的数组

代码实现:

golang:


package main

import "sort"

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 计算成功举办活动需要多少名主持人
 * @param n int整型 有n个活动
 * @param startEnd int整型二维数组 startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间
 * @return int整型
 */
func minmumNumberOfHost(n int, startEnd [][]int) int {
	// write code here
	start := make([]int, n)
	end := make([]int, n)
	for i := 0; i < n; i++ {
		start[i] = startEnd[i][0]
		end[i] = startEnd[i][1]
	}
	sort.Ints(start)
	sort.Ints(end)
	var nums, j int
	for i := 0; i < n; i++ {
		if start[i] >= end[j] {
			j++
		} else {
			nums++
		}
	}
	return nums
}

php :




/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 计算成功举办活动需要多少名主持人
 * @param n int整型 有n个活动
 * @param startEnd int整型二维数组 startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间
 * @return int整型
 */
function minmumNumberOfHost( $n ,  $startEnd )
{
    // write code here
    //分别获取活动开始时间和结束时间
    $startList = [];
    $endList = [];
    for($i=0; $i<$n; $i++){
        $startList[$i] = $startEnd[$i][0];
        $endList[$i] = $startEnd[$i][1];
    }
    //各自按升序排序
    sort($startList);
    sort($endList);

    $nums = 0; //主持人数
    $j = 0;
    for($k=0; $k<$n; $k++){
        if($startList[$k] >= $endList[$j]){//新开始的节目大于上一轮结束的时间,主持人不变
            $j++;
        }else{
            $nums++;
        }
    }
    return $nums;
}

你可能感兴趣的:(多语言LeeCode的题解,贪心算法,算法)