2332. 坐上公交的最晚时间

题目描述:

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

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

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

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

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

示例 1:

输入:buses = [10,20], passengers = [2,17,18,19], capacity = 2
输出:16
解释:
第 1 辆公交车载着第 1 位乘客。
第 2 辆公交车载着你和第 2 位乘客。
注意你不能跟其他乘客同一时间到达,所以你必须在第二位乘客之前到达。

示例 2:

输入:buses = [20,30,10], passengers = [19,13,26,4,25,11,21], capacity = 2
输出:20
解释:
第 1 辆公交车载着第 4 位乘客。
第 2 辆公交车载着第 6 位和第 2 位乘客。
第 3 辆公交车载着第 1 位乘客和你。

提示:

  • n == buses.length
  • m == passengers.length
  • 1 <= n, m, capacity <= 105
  • 2 <= buses[i], passengers[i] <= 109
  • buses 中的元素 互不相同
  • passengers 中的元素 互不相同 。

解题分析及思路:

方法:模拟

思路:

首先,按照“我”未上车的前提下,让其他乘客按照原有规则上车,到最后一辆车后,“我”需要上最后一辆车,那么存在两种情况:

  1. 所有的乘客都上车了,并且还有一个位置让“我”坐,那么“我”是最后一位乘客,“我”的上车时间最晚和最后一辆车的到达时间一样(此前提下,“我”的上车时间不能和之前上车的乘客时间冲突)。
  2. 所有的乘客都上车了,但是没有位置让“我”坐,那么“我”是最后一位乘客,“我”的上车时间要比最后一辆车的最后一个乘客上车时间早,我才能顺利上车(此前提下,“我”的上车时间不能和之前上车的乘客时间冲突)。

那么,可以用count记录每辆车上的乘客数目

  1. count != capacity,说明还有位置让“我”坐,那么“我”的上车时间最晚和最后一辆车的到达时间一样(此前提下,“我”的上车时间不能和之前上车的乘客时间冲突)。
  2. count == capacity,说明车上位置已经满了,那么“我”的上车时间要比最后一辆车的最后一个乘客上车时间早,我才能顺利上车(此前提下,“我”的上车时间不能和之前上车的乘客时间冲突)。

为避免“我”的上车时间和之前上车的乘客时间冲突,需要将乘客按照到达时间排序,同时将公交车按照出发时间排序。

func latestTimeCatchTheBus(buses []int, passengers []int, capacity int) int {
	sort.Ints(buses)
	sort.Ints(passengers)
	var buseIndex int
	var passengerIndex int
	var count int
	for ; buseIndex < len(buses); buseIndex++ {
		count = 0
		for count < capacity && passengerIndex < len(passengers) && buses[buseIndex] >= passengers[passengerIndex] {
			count++
			passengerIndex++
		}
	}
	ans := buses[len(buses)-1]
	passengerIndex--
	if count == capacity {
		ans = passengers[passengerIndex]
	}
	for passengerIndex >= 0 && ans == passengers[passengerIndex] {
		ans--
		passengerIndex--
	}
	return ans
}

复杂度:

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

执行结果:

  • 执行耗时:115 ms,击败了16.67% 的Go用户
  • 内存消耗:8.9 MB,击败了75.00% 的Go用户

通过次数 21.8K 提交次数 69K 通过率 31.6%

Related Posts

1026. 节点与其祖先之间的最大差值

## 题目描述:给定二叉树的根节点 root,找出存在于 不同 节点 A 和 B 之间的最大值 V,其中 V = |A.val - B.val|,且 A 是 B 的祖先。(如果 A 的任何子节点之一为 B,或者 A 的任何子节点是 B 的祖先,那么我们认为 A 是 B 的祖先)示例 1: ![](/img/leetcode/1026节点与其祖先之间的最大差值/tmp-tre

read more

1038. 从二叉搜索树到更大和树

## 题目描述:给定一个二叉搜索树 root (BST),请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。提醒一下, 二叉搜索树 满足下列约束条件:- 节点的左子树仅包含键 小于 节点键的节点。 - 节点的右子树仅包含键 大于 节点键的节点。 - 左右子树也必须是二叉搜索树。*示例 1:***![](/img/leetcode/

read more

105. 从前序与中序遍历序列构造二叉树

## 题目描述:给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。示例 1: ``` 输入: preorder = [3,9,20,15,7], inorder = [

read more

106. 从中序与后序遍历序列构造二叉树

## 题目描述:给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。示例 1: ``` 输入:inorder = [9,3,15,20,7], postorder

read more

109. 有序链表转换二叉搜索树

## 题目描述:给定一个单链表的头节点 head ,其中的元素 按升序排序 ,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。示例 1: ``` 输入: head = [-10,-3,0,5,9] 输出: [0,-3,9

read more

114. 二叉树展开为链表

## 题目描述:给你二叉树的根结点 root ,请你将它展开为一个单链表:- 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。 - 展开后的单链表应该与二叉树 先序遍历 顺序相同。示例 1: ``` 输入:root

read more