前言
每天和你一起刷 LeetCode 每日一题~
大家国庆节快乐呀~
LeetCode 启动!
题目:准时到达的列车最小时速
代码与解题思路
今天这道题是经典的二分答案,结合这道题来讲就是,二分列车的速度
我最擅长的两个算法:一个是二分,一个是滑动窗口,那趁着今天的题目是二分相关,就顺便分享一下我用的二分模版
整数二分模板
模板一:用于左半区间不存在答案,而右半区间存在答案的情况,也就是在 [ left,mid ],[ mid + 1,right ]
C++ 版本
cpp
int l = 0, r = n - 1;
while (l < r) {
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
Golang 版本
go
l, r := 0, len(nums)-1
for l < r {
mid := l+(r-l)/2
if check(mid) {
r = mid
} else {
l = mid + 1
}
}
模板二:用于左半区间存在答案,而右半区间不存在答案的情况,也就是在 [ left,mid - 1 ],[ mid,right ]
C++ 版本
cpp
int l = 0, r = n - 1;
while (l < r) {
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
Golang 版本
go
l, r = 0, len(nums)-1
for l < r {
mid := l+(r-l+1)/2
if check(mid) {
l = mid
} else {
r = mid - 1
}
}
模板记忆方法:有 - 1,那求 mid 的时候就需要 + 1
这两个模板包含了整数二分的所有情况,至少我到现在还没有碰到这两个模板解决不了的整数二分题目,当然,模版只是模版,多练习题目才是提升算法能力的王道
不妨就用今天的题目来试试我这个模版吧~
go
func minSpeedOnTime(dist []int, hour float64) int {
length := len(dist)
check := func(speed float64) bool {
var cost float64
for _, v := range dist[:length-1] {
cost += math.Ceil(float64(v) / speed) // 上取整
}
cost += float64(dist[length-1]) / speed // 最后一趟不用取整
return cost <= hour // 能准时到达就返回 true
}
if hour <= float64(length-1) { // 最短一个小时一趟车,车次超过最短时间直接返回 -1
return -1
}
left, right := 1, 10000000
for left < right {
mid := (left + right) / 2
if check(float64(mid)) {
right = mid
} else { // 不能准时到达,让 speed 增大
left = mid + 1
}
}
return left
}
视频实况
【【LeetCode】每日一题 2024_10_2 准时到达的列车最小时速(二分答案)】
每天进步一点点
可以和我刷一辈子的每日一题吗?
一题一题,积累起来就是一辈子。