题目描述
leecode medium题 “539. Minimum Time Difference”
分析
别看该题是中等难度的题,只要缕清思路,就很简单,代码也很容易写。如题所述,我们要找最小的时间差。最暴力的一种方法就是让所给出的时间自由组合计算出各个的时间差,取最小的。
但我们并没有必要计算出所有组合的,因为有些时间的组合我们是可以直接排除的。怎么排除?拿[00:20,12:45,20:13,23:11]举例,对所有的时间进行排序后,那么第一个时间和第二个时间的差肯定会小于(或等于)第一个时间和第三个(或第四个,第n个)的时间差,后者我们就没必要计算,可直接排除了。
所以,我们只需计算排序好的时间,两两之间的时间差取最小。但还有一个问题我们还没有考虑进去,就是跨天的时间,也即排序好的时间的头和尾的插计算,比如23:11和00:20,它俩的时间差可以是23:11-00:20(已经被我们排除不计算),但也可以是00:20-23:11。所以我们需要把后者计算出来,与之前筛选出来的最小时间差比较,看谁更小,来得到最终过结果。
可能你会有个疑问,为什么跨天的时间差你就只计算一个,而不计算诸如20:13和00:20的时间差呢?同样道理,因为我们已经排过序了,那么数组末尾和数组开头的这个跨天时间差就一定是所有以跨天模式计算中最小的时间差了,其他的就没必要再计算了。
代码实现
有时候,我们要善于站在巨人的肩膀上。所以,本次代码使用c++编写,直接使用了一些现成的函数,如排序,string转int等。
class Solution {
public:
int findMinDifference(vector<string>& timePoints) {
//排序
sort(timePoints.begin(),timePoints.end());
int min=1500,d;
//数组内两两之间的时间差
for (int i = 0; i < timePoints.size()-1;i++){
d=minutesDiffer(timePoints[i],timePoints[i+1],0);
if(d<min)
min=d;
}
//头和尾以跨天形式计算的时间差
d=minutesDiffer(timePoints[timePoints.size()-1],timePoints[0],1);
if(d<min)
min=d;
return min;
}
int minutesDiffer(string &v1,string &v2,bool cross){
int diff;
string hour1=v1.substr(0,2);
string hour2=v2.substr(0,2);
string min1=v1.substr(3,2);
string min2=v2.substr(3,2);
if(cross){
diff=atoi(min2.c_str())+(60-atoi(min1.c_str()))+60*(atoi(hour2.c_str())+(23-atoi(hour1.c_str())));
}else{
if(hour2.compare(hour1)==0){
diff=atoi(min2.c_str())-atoi(min1.c_str());
}else{
diff=atoi(min2.c_str())+(60-atoi(min1.c_str()))+60*(atoi(hour2.c_str())-atoi(hour1.c_str())-1);
}
}
return diff;
}
};