539.最小时间差

68 阅读1分钟

题目:
给定一个 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
}