【LeetCode】每日一题 2024_10_2 准时到达的列车最小时速(二分答案)

发布于:2024-10-09 ⋅ 阅读:(36) ⋅ 点赞:(0)

前言

每天和你一起刷 LeetCode 每日一题~

大家国庆节快乐呀~

LeetCode 启动!

题目:准时到达的列车最小时速

代码与解题思路

今天这道题是经典的二分答案,结合这道题来讲就是,二分列车的速度

我最擅长的两个算法:一个是二分,一个是滑动窗口,那趁着今天的题目是二分相关,就顺便分享一下我用的二分模版

整数二分模板

模板一:用于左半区间不存在答案,而右半区间存在答案的情况,也就是在 [ left,mid ],[ mid + 1,right ]

C++ 版本

int l = 0, r = n - 1;
while (l < r) {
    int mid = l + r >> 1;
    if (check(mid)) r = mid;
    else l = mid + 1;
}

Golang 版本

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++ 版本

 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 版本

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


这两个模板包含了整数二分的所有情况,至少我到现在还没有碰到这两个模板解决不了的整数二分题目,当然,模版只是模版,多练习题目才是提升算法能力的王道

不妨就用今天的题目来试试我这个模版吧~

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 准时到达的列车最小时速(二分答案)】

每天进步一点点

可以和我刷一辈子的每日一题吗?
一题一题,积累起来就是一辈子。