题目
给定一个 24 小时制(小时:分钟 “HH:MM”)的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
示例 1:
示例 2:
提示:
解法
由于求任意两个时间的最小时间差,如果不进行排序的话,两两比较,复杂度为
O
(
N
2
)
O(N^2)
O(N2),进行排序后再进行比较的话,只需要比较前后以及最后及第一个的时间差即可,时间复杂度为
O
(
N
l
o
g
N
)
O(NlogN)
O(NlogN)。
另外就是将字符串转化为分钟,需要有这样的一个函数。
特殊情况
-
时间长度大于24*60,则有24小时重合的时间出现,最小时间差为0;
-
第一个时间与最后一个时间也需要进行比较;
-
python
class Solution(object):
def findMinDifference(self, timePoints):
"""
:type timePoints: List[str]
:rtype: int
"""
n = len(timePoints)
if (n > 24 * 60): # 判断长度,如果长度包含一天的每一分钟,则最短时间差为0
return 0
timePoints.sort()
ans = float('inf')
t0_minuter = self.get_minuters(timePoints[0])
pre_minuter = t0_minuter
for i in range(1, n):
cur_minuter = self.get_minuters(timePoints[i])
ans = min(ans, cur_minuter-pre_minuter)
pre_minuter = cur_minuter
ans = min(ans, t0_minuter+1440-pre_minuter) # 第一个与最后一个进行比较,添加24小时
return ans
def get_minuters(self, timePoint):
h, m = int(timePoint[:2]), int(timePoint[-2:])
return h * 60 + m
- c++
class Solution {
public:
int findMinDifference(vector<string>& timePoints) {
int n = timePoints.size();
if (n > 24*60)
{
return 0;
}
sort(timePoints.begin(), timePoints.end());
int ans = INT_MAX;
int t0_minuters = getMinuters(timePoints[0]);
int pre_minuters = t0_minuters;
for(int i=1; i<n; i++)
{
int minuters = getMinuters(timePoints[i]);
ans = min(ans, minuters-pre_minuters);
pre_minuters = minuters;
}
ans = min(ans, t0_minuters+1440-pre_minuters);
return ans;
}
int getMinuters(string &t)
{
return ((int(t[0]-'0')*10 + int(t[1]-'0')))*60 + int(t[3]-'0')*10 + int(t[4]-'0');
}
};
复杂度分析
- 时间复杂度:
- O ( N l o g N ) O(NlogN) O(NlogN) 排序需要的时间
- 空间复杂度
- O ( N ) O(N) O(N)或 O ( l o g N ) O(logN) O(logN) 排序需要的空间,取决于不同语言的实现