Leetcode 539. 最小时间差
题目
给定一个 24 小时制(小时:分钟)的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
示例:
输入: ["23:59","00:00"]
输出: 1
备注:
- 列表中时间数在 2~20000 之间。
- 每个时间取值在 00:00~23:59 之间。
题解
用一个优先队列,优先队列为根据时间早晚建立的大顶堆(晚放到顶)。然后,我们获取相邻的两个时间的时间差,更新最小值。最后,我们需要获取最早和最晚的两个时间的时间差,更新最小值。详细过程见代码
代码
struct sortTime{
bool operator () (pair<int,int>& p1,pair<int,int>& p2){
if(p1.first == p2.first) return p1.second < p2.second;
return p1.first < p2.first;
}
};
int getD(pair<int,int>& big,pair<int,int> small){ //获取时间差,单位为分钟
int ans;
if(big.second < small.second){
ans = big.second+60-small.second;
big.first--;
}else ans = big.second-small.second;
ans += (big.first-small.first)*60;
return ans;
}
int findMinDifference(vector<string>& timePoints) {
priority_queue<pair<int,int>,vector<pair<int,int>>,sortTime> time;
for(int i=0; i<timePoints.size(); i++){
int h=0,m=0;
h = (timePoints[i][0]-'0')*10 + (timePoints[i][1]-'0'); //小时
m = (timePoints[i][3]-'0')*10 + (timePoints[i][4]-'0'); //分钟
time.push(make_pair(h,m));
}
pair<int,int> maxBig = time.top();
pair<int,int> big = time.top();
time.pop();
int ans=INT_MAX;
while(!time.empty()){
int d = getD(big,time.top());
ans = min(ans,d);
big = time.top();
time.pop();
}
big.first+=24;
ans = min(ans,getD(big,maxBig));
return ans;
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-time-difference
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。