Leetcode 539. 最小时间差

539. 最小时间差

一、题目

原题链接:539. 最小时间差

1.题目描述

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

  • 示例 1:

    输入:timePoints = ["23:59","00:00"]
    输出:1
    
  • 示例 2:

    输入:timePoints = ["00:00","23:59","00:00"]
    输出:0
    
  • 提示:

    2 <= timePoints.length <= 2 * 10^4
    timePoints[i] 格式为 "HH:MM"

2.基础框架

C++基础框架代码如下:

int findMinDifference(vector<string>& timePoints) {
}

3.解题思路

  • 题目分析
  1. 题目目标是以分钟数形式返回最小时间差。

  2. 大体思路是排序,然后最小的相邻时间差作为返回值。

  3. 时钟列表应看作循环的数组,比如22:001:00的分钟数最小差值应为3 * 60,而不是21 * 60

    所以需要定义一个数组的长度为 2 * n - 1

  4. 排序前需要将字符串的时间转换成分钟数。排序的范围为[0, n),[n, 2n - 1)这部分为对称部分,不作为排序的范围。

  5. 可以对固定的下标位置取出小时和分钟的字符,然后转换成整型分钟数再进行比较。

  6. 比较的时候会发现,当"00:00","23:59"比较的的时候,分钟数差值最小值应为1。

    假设ab进行比较:

    • a > b时,两者之间的最小分钟数差值为:a - b
    • a < b,则两者之间的最小分钟数差值为:a + 1440 - b
  • 实现代码:

    int findMinDifference(vector<string>& timePoints) {
        int n = timePoints.size();
        vector<int> rec(2 * n - 1, -1);
        int i;
        for (i = 0; i < n; i++)
        {
            int hour, minu;
            hour = (timePoints[i][0] - '0') * 10;
            hour += (timePoints[i][1] - '0');
            minu = (timePoints[i][3] - '0') * 10;
            minu += (timePoints[i][4] - '0');
            rec[i] = hour * 60 + minu;
        }
        sort(rec.begin(), rec.end() - n + 1);
            
        int j = 0;
        for (i = n; i < 2 * n - 1; i++)
        {
            rec[i] = rec[j++];
        }
        int min = 1440;
        for (int i = 1; i < rec.size(); i++)
        {
            int tmp;
            if (rec[i] >= rec[i - 1])
                tmp = rec[i] - rec[i - 1];
            else
            {
                tmp = (rec[i] + 1440) - rec[i - 1];
            }
            if (tmp < min)
                min = tmp;
        }
        return min;
    }
    
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值