LeetCode 每日一题笔记
0. 前言
- 日期:2026.06.18
- 题目:1344. 时钟指针的夹角
- 难度:中等
- 标签:数学、模拟
1. 题目理解
问题描述
给定小时 hour 和分钟 minutes,计算时针与分针形成的较小夹角(角度制,0~180)。
规则:
- 分针每分钟走6°;
- 时针每小时走30°,每分钟额外走0.5°;
- 两指针夹角取
min(差值, 360-差值)。
示例
输入:hour = 12, minutes = 30
输出:165.0
解释:分针在180°,时针在15°,差值165°,小于180直接返回。
2. 解题思路
核心观察
- 分针角度公式:
minutes * 6.0; - 时针角度公式:
(hour % 12) * 30.0 + minutes * 0.5; - 夹角绝对值
diff,最终结果取min(diff, 360 - diff); - 可使用
Math.min消除if条件分支。
算法步骤
- 分别计算时针、分针的绝对角度;
- 求两个角度差值的绝对值;
- 取差值与360-差值中的较小值返回。
3. 代码实现
java
class Solution {
public double angleClock(int hour, int minutes) {
double time =(hour+((double)minutes/60))*5%60;
double a = Math.abs(time-minutes);
double res = a*6;
if(a*6>180){
return (double)360-a*6;
}
return a*6;
}
}
4. 代码优化说明
java
class Solution {
public double angleClock(int hour, int minutes) {
// 计算时针总角度,小时模12适配12点
double hAngle = (hour % 12) * 30.0 + minutes * 0.5;
// 分针每分钟6度
double mAngle = minutes * 6.0;
// 两指针角度差绝对值
double diff = Math.abs(hAngle - mAngle);
// 使用Math.min替代if分支,直接取更小夹角
return Math.min(diff, 360.0 - diff);
}
}
5. 复杂度分析
- 原始代码
时间复杂度:O(1)O(1)O(1),仅常数数学运算;存在if分支判断
空间复杂度:O(1)O(1)O(1),无额外内存占用 - 优化代码
时间复杂度:O(1)O(1)O(1),纯数学计算,消除条件分支跳转
空间复杂度:O(1)O(1)O(1),变量更少,公式直观易读
6. 总结
- 核心:通过数学公式分别计算时针、分针角度,再取最小夹角;
- 优化亮点:用
Math.min替换if判断,减少分支;拆分时针分针计算,逻辑更直观; - 关键公式:时针
(hour%12)*30 + 0.5*min,分针6*min,最小夹角min(diff,360-diff)。