题目概述:
题目链接:点我做题
题解
字符串的排序会比较首字符的ASCII码如果相同再比较后面的字符,对于我们排列时间的要求,显然是可以满足的,排序后,最短的时间间隔一定是它的前面一个元素的时间和当前遍历的这个元素的时间差或是首尾的时间差中的最小值,为了获得分钟差,实现由字符串时间转化为一天中的分钟的函数就行。
我们知道一天中只有1440分钟,如果穿过来的时间数组的元素个数大于1440,那么一定有重复时间,最短时间差显然是0,返回0即可。
class Solution {
public:
int findMinDifference(vector<string>& timePoints)
{
int size = timePoints.size();
if (size > 1440)
{
return 0;
}
sort(timePoints.begin(), timePoints.end());
//最小时间差一般只出现在排序后的相邻部分或者两端
//下面先处理相邻部分
int prevminute = Gettimeminute(timePoints[0]);
int min = INT_MAX;
for (int i = 1; i < size; i++)
{
int curtime = Gettimeminute(timePoints[i]);
int curmin = curtime - prevminute;
if (curmin < min)
{
min = curmin;
}
prevminute = curtime;
}
//处理首尾
int firstlastgap = Gettimeminute(timePoints[0]) - Gettimeminute(timePoints[size - 1]) + 1440;
if (firstlastgap < min)
{
min = firstlastgap;
}
return min;
}
int Gettimeminute(const string& s)
{
return ((s[0] - '0') * 10 + (s[1] - '0')) * 60 + (s[3] - '0') * 10 + (s[4] - '0');
}
};
时间复杂度:
O
(
m
i
n
(
1440
,
n
)
l
o
g
(
n
,
1440
)
)
O(min(1440,n)log(n,1440))
O(min(1440,n)log(n,1440))
空间复杂度:
O
(
1
)
O(1)
O(1)