【leetcode】Day42-1220.统计元音字母序列数目
给定一个 24 小时制(小时:分钟 "HH:MM")的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
解法①:排序直接计算
def getMinutes(t: str) -> int:
#返回对应的分钟数,ord(str)将内部的str转化为ASCII码,减去ord("0")代表对应的整数
return ((ord(t[0]) - ord('0')) * 10 + ord(t[1]) - ord('0')) * 60 + (ord(t[3]) - ord('0')) * 10 + ord(t[4]) - ord('0')
class Solution:
def findMinDifference(self, timePoints: List[str]) -> int:
#先排序,方便计算首尾时间差
timePoints.sort()
ans = float('inf')
t0Minutes = getMinutes(timePoints[0])
preMinutes = t0Minutes
#遍历从第二个时间点开始
for i in range(1, len(timePoints)):
minutes = getMinutes(timePoints[i])
ans = min(ans, minutes - preMinutes) # 相邻时间的时间差
preMinutes = minutes
#为什么有这一步?比如排序之后出现这种情况:["00:01","12:20","23:59"]
#24 * 60 = 1440个时间情况
ans = min(ans, t0Minutes + 1440 - preMinutes) # 首尾时间的时间差
return ans
复杂度:
时间复杂度:O(nlogn),其中 n 是数组 timePoints 的长度。排序需要 O(nlogn) 的时间。
空间复杂度:O(logn)。排序需要 O(logn) 的栈空间。
解法②:鸽巢原理
def getMinutes(t: str) -> int:
return ((ord(t[0]) - ord('0')) * 10 + ord(t[1]) - ord('0')) * 60 + (ord(t[3]) - ord('0')) * 10 + ord(t[4]) - ord('0')
class Solution:
def findMinDifference(self, timePoints: List[str]) -> int:
n = len(timePoints)
if n > 1440:
return 0
timePoints.sort()
ans = float('inf')
t0Minutes = getMinutes(timePoints[0])
preMinutes = t0Minutes
for i in range(1, n):
minutes = getMinutes(timePoints[i])
ans = min(ans, minutes - preMinutes) # 相邻时间的时间差
preMinutes = minutes
ans = min(ans, t0Minutes + 1440 - preMinutes) # 首尾时间的时间差
return ans
复杂度:
时间复杂度:O(min(n,C)logmin(n,C)),其中 nn 是数组 timePoints 的长度 C=24×60=1440。由于当 n>C 时直接返回 0,排序时的 n 不会超过 C,因此排序需要 O(min(n,C)logmin(n,C)) 的时间。
空间复杂度:O(logmin(n,C))。排序需要 O(logmin(n,C)) 的栈空间。