地址:
力扣https://leetcode-cn.com/problems/minimum-time-difference/
题目:
给定一个 24 小时制(小时:分钟 "HH:MM")的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
示例 1:
输入:timePoints = ["23:59","00:00"] 输出:1 |
示例 2:
输入:timePoints = ["00:00","23:59","00:00"] 输出:0 |
提示:
2 <= timePoints <= 2 * 104 timePoints[i] 格式为 "HH:MM" |
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-time-difference
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
第一步还是元素有序化,最小差一定发生在相邻两个元素之间
要注意循环的情况,即第一个元素 与 最后一个元素的差
譬如:
["23:59","00:00"] 这样理论应该是 1 分钟,0 - 23*60+59 + 60*24
方法一、排序求相邻元素最小差值
int cmp(const int *p1, const int *p2)
{
return (*(int *)p1) - (*(int *)p2);
}
int findMinDifference(char ** timePoints, int timePointsSize){
int *array=(int *)malloc(sizeof(int)*timePointsSize);
if(array == NULL)
return -1;
int i;
int hr,min;
int ans=60*24; // if set 0 , alway be 0
for(i=0; i<timePointsSize; i++)
{
sscanf(timePoints[i], "%d:%d", &hr, &min);
array[i]=hr*60+min;
}
qsort(array, timePointsSize, sizeof(int), cmp);
/* 00:01~23:59 */
for(i=1; i<timePointsSize; i++)
{
if(array[i]-array[i-1] < ans)
ans = array[i]-array[i-1];
}
/* the next day */
if( (array[0]-array[timePointsSize-1] + 60*24) < ans)
ans = array[0]-array[timePointsSize-1] + 60*24;
return ans;
}
结束语:
排序我们直接使用了 排序API,非常方便可以按照自己想要的顺序排列好
函数原型:
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*));
其中:
base | 指向要排序的数组 |
nitems | 数组大小 |
size | 数组元素类型 |
compar | 函数指针,我们需要自己构建 |
函数指针原型:
int compar(const void *p1, const void *p2);
其中:
升序排列 | 返回值 > 0 |
降序排列 | 返回值 < 0 |
顺序不确定 | 返回值 = 0 |