剑指 Offer II 035. 最小时间差
剑指 Offer II 035. 最小时间差
给定一个 24 小时制(小时:分钟 "HH:MM")的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
示例 1:
输入:timePoints = ["23:59","00:00"] 输出:1
示例 2:
输入:timePoints = ["00:00","23:59","00:00"] 输出:0
提示:
2 <= timePoints <= 2 * 104timePoints[i]格式为 "HH:MM"
1 class Solution { 2 public: 3 static constexpr int MAX_DIFF_TIME = 1440; // 最大时间差单位:min 4 int helper(bool (&minutesFlag)[MAX_DIFF_TIME]) { 5 int minDiffTime = MAX_DIFF_TIME - 1; // 最小时间间隔初始化为最大值 6 int pre = -1; 7 int first = MAX_DIFF_TIME - 1; 8 int last = -1; 9 for (int curTime = 0; curTime < MAX_DIFF_TIME; curTime++) { 10 if (!minutesFlag[curTime]) { 11 continue; 12 } 13 if (pre >= 0) { 14 minDiffTime = std::min(minDiffTime, curTime - pre); 15 } 16 pre = curTime; 17 first = std::min(first, curTime); 18 last = std::max(last, curTime); 19 } 20 minDiffTime = std::min(minDiffTime, MAX_DIFF_TIME - last + first); 21 return minDiffTime; 22 } 23 int findMinDifference(vector<string>& timePoints) { 24 // 如果给定数组大小超过最大时间差,说明存在重复的元素,最小时间差则为0 25 if (timePoints.size() > MAX_DIFF_TIME) { 26 return 0; 27 } 28 // 存储每个时间点是否在数组中出现过 29 bool minutesFlag[MAX_DIFF_TIME] = {0}; 30 for (auto time : timePoints) { 31 int minute = stoi(time.substr(0, 2)) * 60 + stoi(time.substr(3, 2)); 32 if (minutesFlag[minute]) { // 说明存在重复时间 33 return 0; 34 } 35 minutesFlag[minute] = true; 36 } 37 return helper(minutesFlag); 38 } 39 };
浙公网安备 33010602011771号