题目:
给定一个 24 小时制(小时:分钟 "HH:MM" )的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
算法:
方法一:归并排序
var totalMinute = 24 * 60
func findMinDifference(timePoints []string) int {
ans := math.MaxInt32
var mergeSort func(nums []string, left, right int)
mergeSort = func(nums []string, left, right int) {
if left == right {
return
}
mid := (left + right) / 2
mergeSort(nums, left, mid)
mergeSort(nums, mid+1, right)
tmp := make([]string, 0)
leftStart, rightStart := left, mid+1
for leftStart <= mid && rightStart <= right {
if nums[leftStart] < nums[rightStart] {
if len(tmp) > 0 && tmp[len(tmp)-1] < nums[leftStart] {
diff := getDifference(nums[leftStart], tmp[len(tmp)-1])
if diff < ans {
ans = diff
}
}
tmp = append(tmp, nums[leftStart])
leftStart++
} else if nums[leftStart] > nums[rightStart] {
if len(tmp) > 0 && tmp[len(tmp)-1] < nums[rightStart] {
diff := getDifference(nums[rightStart], tmp[len(tmp)-1])
if diff < ans {
ans = diff
}
}
tmp = append(tmp, nums[rightStart])
rightStart++
} else {
ans = 0
return
}
}
for leftStart <= mid {
if len(tmp) > 0 && tmp[len(tmp)-1] < nums[leftStart] {
diff := getDifference(nums[leftStart], tmp[len(tmp)-1])
if diff < ans {
ans = diff
}
}
tmp = append(tmp, nums[leftStart])
leftStart++
}
for rightStart <= right {
if len(tmp) > 0 && tmp[len(tmp)-1] < nums[rightStart] {
diff := getDifference(nums[rightStart], tmp[len(tmp)-1])
if diff < ans {
ans = diff
}
}
tmp = append(tmp, nums[rightStart])
rightStart++
}
if len(tmp) >= 2 {
diff := getDifference(tmp[len(tmp)-1], tmp[0])
if diff < ans {
ans = diff
}
}
for i := range tmp {
nums[left+i] = tmp[i]
}
}
mergeSort(timePoints, 0, len(timePoints)-1)
return ans
}
// 注意入参a >= b
func getDifference(a, b string) int {
if a == "23:59" && b == "00:00" {
return 1
}
aPoints := strings.Split(a, ":")
bPoints := strings.Split(b, ":")
aHour, _ := strconv.Atoi(aPoints[0])
aMinute, _ := strconv.Atoi(aPoints[1])
bHour, _ := strconv.Atoi(bPoints[0])
bMinute, _ := strconv.Atoi(bPoints[1])
dist := (aHour*60 + aMinute) - (bHour*60 + bMinute)
return min(dist, totalMinute - dist)
}
func min(a, b int) int {
if a < b {
return a
}
return b
}