题目

给定一个 24 小时制(小时:分钟 "HH:MM")的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。

示例:

输入:timePoints = ["23:59","00:00"]

输出:1


解答

通过字符串排序,将时间进行从小到大的排序;

然后依次求相邻时间的差值即可。

此外需要注意加上第一个和最后一个时间的差,同时,也可以依据 “一天24小时最多有24 * 60 = 1440个分钟时刻” 进行剪枝。

代码如下:

class Solution {
public:
    int getDiff(string &a, string &b) {
        int hourA = (a[0] - '0') * 10 + (a[1] - '0');
        int hourB = (b[0] - '0') * 10 + (b[1] - '0');
        int minA = (a[3] - '0') * 10 + (a[4] - '0');
        int minB = (b[3] - '0') * 10 + (b[4] - '0');

        int l = abs((hourA - hourB) * 60 + minA - minB);

        return min(l, 1440 - l);
    }

    int findMinDifference(vector<string> &timePoints) {
        int n = timePoints.size();      
        // n > 1440 进行剪枝,因为最多只能有1440个分钟时刻
        if (n > 1440) {
            return 0;
        }
      
        // 将时间序列进行排序
        sort(timePoints.begin(), timePoints.end());       

        int ret = getDiff(timePoints[0], timePoints[n - 1]);

        string before = timePoints[0];
        // 依次比较即可
        for (int i = 1; i < n; ++i) {
            int tmp = getDiff(before, timePoints[i]);
            if (tmp < ret) {
                ret = tmp;
            }
            before = timePoints[i];
        }

        return ret;
    }
};