找出所有时间中的最小时间差。

【问题描述】

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

【输入形式】

 第一行输入一个不小于2,不大于1000的正整数n,之后输入n行,每行一个 HH:MM形式的字符串表示一个24小时制的时间

【输出形式】

只有一行,即最小时间差

public int findMinDifference(List<String> timePoints) {
        int len = timePoints.size();
        int[] a = new int[50000];
        int j=0;
        for(String i:timePoints) {
            a[j++] = Integer.parseInt(i.substring(0, 2))*60+Integer.parseInt(i.substring(3, 5));
            a[j++] = Integer.parseInt(i.substring(0, 2))*60+Integer.parseInt(i.substring(3, 5))+1440;
        }
        Arrays.sort(a,0,j);
        int min=1440;
        for(int i=1;i<j;i++) {
            min=(a[i]-a[i-1])<=min?(a[i]-a[i-1]):min;
        }
        return min;
    }

class Solution {
public int findMinDifference(List timePoints) {
int n=timePoints.size();
if(n>1440){
return 0;
}
int[] times=new int[n];
// 将时间全部转化为分钟
for(int i=0;i<n;i++){

        String m=timePoints.get(i).substring(0,2);
        String s=timePoints.get(i).substring(3,5);
        times[i]=Integer.parseInt(m)*60+Integer.parseInt(s);
    }
    int result=Integer.MAX_VALUE;
    
    for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){
            // 两个时间最小时间
            int time=Math.min(Math.abs(times[i]-times[j]),Math.abs(Math.abs(times[i]-times[j])-1440));
            // 所有时间最小差
            result=Math.min(time,result);

        }
    }
    return result;

}

}

class Solution {
    public int findMinDifference(List<String> timePoints) {
        int n=timePoints.size();
        if(n>1440){
            return 0;
        }
        int[] times=new int[n];
        // 将时间全部转化为分钟
        for(int i=0;i<n;i++){

            String m=timePoints.get(i).substring(0,2);
            String s=timePoints.get(i).substring(3,5);
            times[i]=Integer.parseInt(m)*60+Integer.parseInt(s);
        }
        int result=Integer.MAX_VALUE;
        
        for(int i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                // 两个时间最小时间
                int time=Math.min(Math.abs(times[i]-times[j]),Math.abs(Math.abs(times[i]-times[j])-1440));
                // 所有时间最小差
                result=Math.min(time,result);

            }
        }
        return result;

    }
}

class Solution
{
public:
int findMinDifference(vector& timePoints)
{
vector nums;
for (string t : timePoints)
{
int h = stoi(t.substr(0, 2));
int m = stoi(t.substr(3, 2));
int x = h * 60 + m;
nums.push_back(x);
nums.push_back(x + 1440);
}

    sort(nums.begin(), nums.end());
    
    int n = nums.size();
    int res = INT_MAX;
    for (int i = 1; i < n; i ++)
    {
        int x = nums[i - 1];
        int y = nums[i];
        res = min(res, y - x);
    }

    return res;
}       

};

https://leetcode-cn.com/problems/minimum-time-difference/

这个题应该是Lecode上的题目,我去原网站上找了下原题,这样的解是没有问题的。

  1. 一天有 24小时,1440分钟,开一个1440长度的布尔数组模拟哈希表,把时间换算成0~1439之间的数值,将数值对应数组中的位置设置为true

  2. 遍历数组,找离得最近的两个时间点。

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;
    }
};

public int findMinDifference(List<String> timePoints) {
        int len = timePoints.size();
        int[] a = new int[50000];
        int j=0;
        for(String i:timePoints) {
            a[j++] = Integer.parseInt(i.substring(0, 2))*60+Integer.parseInt(i.substring(3, 5));
            a[j++] = Integer.parseInt(i.substring(0, 2))*60+Integer.parseInt(i.substring(3, 5))+1440;
        }
        Arrays.sort(a,0,j);
        int min=1440;
        for(int i=1;i<j;i++) {
            min=(a[i]-a[i-1])<=min?(a[i]-a[i-1]):min;
        }
        return min;
    }