思路:
- 一天有
24
小时,1440
分钟,开一个1440
长度的布尔数组模拟哈希表,把时间换算成0~1439
之间的数值,将数值对应数组中的位置设置为true
; - 遍历数组,找离得最近的两个时间点。
class Solution {
private:
const int maxDiffTime = 1440;
public:
int findMinDifference(vector<string>& timePoints) {
//大于1440个时间,必有两个时间是重复的,即最小间隔为0
if (timePoints.size() > maxDiffTime) return 0;
bool minuteFlags[1440] = {0}; //不要用vector来存bool类型的值,因为不安全,取地址会报错
for (string& time : timePoints)
{
//将字符串表示的时间转换成总的分钟数
int minute = stoi(time.substr(0, 2)) * 60 + stoi(time.substr(3, 2));
if (minuteFlags[minute]) return 0; //若该时间在数组中出现过,则最小时间间隔为0
minuteFlags[minute] = true;
}
//以上是一些优化操作,下面才开始遍历数组找最小间隔
return helper(minuteFlags);
}
int helper(bool minuteFlags[])
{
int minDiff = maxDiffTime - 1; //最小时间间隔初始化为最大
int prev = -1;
int first = maxDiffTime - 1; //first表示数组中最早的时间,last表示最晚的时间
int last = -1; //主要是为了计算00:00与23:59这类情况的
for (int cur = 0; cur < maxDiffTime; ++ cur)
{
if (minuteFlags[cur])
{
if (prev >= 0) minDiff = min(minDiff, cur - prev);
prev = cur; //更新上一节点,first和last节点
first = min(first, cur);
last = max(last, cur);
}
}
//计算00:00与23:59这类情况
minDiff = min(minDiff, first + maxDiffTime - last);
return minDiff;
}
};