持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情
LeetCode每日一题打卡专栏正式启动!不出意外将日更LeetCode的每日一题,敬请期待。
539:最小时间差
题意
给定一个 24 小时制(小时:分钟 "HH:MM" )的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
示例1:
输入:timePoints = ["23:59","00:00"] 输出:1
示例2:
输入:timePoints = ["00:00","23:59","00:00"] 输出:0
提示:
- 格式为 "HH:MM"
题解:排序
第一个注意点:
首先需要注意的是,因为是24小时制,所以最大的差为:12:00——0:00(即12*60=720min)。
我们先将所有的时间转化为分钟,若两者的时间差超过了720min(如示例1中 明显大于了720则表示应该往后计算,即:
于是便可将所有的时间存储到一个数组中,然后按照时间从小到大排序,再两两之间求和。
第二个注意点:
需要注意最后一个时间和第一个时间也需要求差。
具体代码如下:
C++代码:
class Solution {
public:
int findMinDifference(vector<string>& timePoints) {
vector<int> ve;
int n=timePoints.size();
for(int i=0;i<n;i++){
string s=timePoints[i];
int h=(s[0]-'0')*10+(s[1]-'0');
int m=(s[3]-'0')*10+(s[4]-'0');
ve.push_back(h*60+m);
}
sort(ve.begin(),ve.end());
int ans=0x3f3f3f3f;
int num;
for(int i=0;i<n-1;i++){
num=ve[i+1]-ve[i];
if(num>720) num=24*60-num;
ans=min(ans,num);
}
num=ve[n-1]-ve[0];
if(num>720) num=24*60-num;
ans=min(ans,num);
return ans;
}
};
Java代码:
class Solution {
public int findMinDifference(List<String> timePoints) {
List<Integer> list = new ArrayList<>();
int n = timePoints.size();
for (int i = 0; i < n; i++) {
int h = Integer.parseInt(timePoints.get(i).substring(0, 2));
int m = Integer.parseInt(timePoints.get(i).substring(3, 5));
list.add(h * 60 + m);
}
int ans = 0x3f3f3f3f;
// 可以知道最大的情况为:12:00-0:00 差最大为720
Collections.sort(list, new cmp());
int num;
for (int i = 0; i < n - 1; i++) {
num=list.get(i+1)-list.get(i);
if(num>720) num=24*60-num;
ans = Math.min(ans,num);
}
//计算最后一个和第一个的差
num=list.get(n-1)-list.get(0);
if(num>720) num=24*60-num;
ans=Math.min(ans,num);
return ans;
}
class cmp implements Comparator {
@Override
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
if((int)o1-(int)o2>=0) return 1;
else return -1;
}
}
}