LeetCode 539. 最小时间差

题目描述

539. 最小时间差

思路分析

解法一:排序 + 相邻差值(推荐)

核心思路

  • 将时间字符串转换为分钟数并排序。
  • 最小差值一定出现在排序后相邻时间或首尾跨天之间。


复杂度分析

  • 时间复杂度:O(n log n),排序开销。
  • 空间复杂度:O(n)。
import java.util.Arrays;
import java.util.List;

class Solution {
    public int findMinDifference(List<String> timePoints) {
        int n = timePoints.size();
        int[] mins = new int[n];

        for (int i = 0; i < n; i++) {
            String t = timePoints.get(i);
            int hour = Integer.parseInt(t.substring(0, 2));
            int min = Integer.parseInt(t.substring(3));
            mins[i] = hour * 60 + min;
        }

        Arrays.sort(mins);
        int ans = 1440;

        for (int i = 1; i < n; i++) {
            ans = Math.min(ans, mins[i] - mins[i - 1]);
        }

        // 首尾跨天
        ans = Math.min(ans, 1440 - mins[n - 1] + mins[0]);
        return ans;
    }
}
import "sort"

func findMinDifference(timePoints []string) int {
	n := len(timePoints)
	mins := make([]int, n)

	for i, t := range timePoints {
		hour := (int(t[0]-'0')*10 + int(t[1]-'0'))
		minute := (int(t[3]-'0')*10 + int(t[4]-'0'))
		mins[i] = hour*60 + minute
	}

	sort.Ints(mins)
	ans := 1440
	for i := 1; i < n; i++ {
		diff := mins[i] - mins[i-1]
		if diff < ans {
			ans = diff
		}
	}

	cross := 1440 - mins[n-1] + mins[0]
	if cross < ans {
		ans = cross
	}
	return ans
}

相似题目

题目 难度 考察点
539. 最小时间差 中等 排序
681. 最近时刻 中等 模拟
949. 给定数字能组成的最大时间 中等 枚举
1064. 不动点 简单 排序
252. 会议室 简单 排序
253. 会议室 II 中等
本文作者:
本文链接: https://hgnulb.github.io/blog/2024/36762315
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!