网易首页 > 网易号 > 正文 申请入驻

2025-04-25:移山所需的最少秒数。用go语言,给定一个整数 mountainHeight,代表一座山的高度。 还有一个整

0
分享至

2025-04-25:移山所需的最少秒数。用go语言,给定一个整数 mountainHeight,代表一座山的高度。

还有一个整数数组 workerTimes,其中每个元素表示对应工人完成单位高度降低所需的时间(单位为秒)。

工人必须同时开始工作以降低山的高度。对于第 i 个工人,如果他降低了高度为 x,那么他所花费的时间是:

workerTimes[i] * (1 + 2 + ... + x) = workerTimes[i] * (x * (x + 1) / 2)

举例:

1.降低高度为 1,需要花费 workerTimes[i] 秒;

2.降低高度为 2,需要花费 workerTimes[i] * (1 + 2) 秒;

3.以此类推。

任务是求出所有工人一起合作,把山降到高度 0,所需的最小时间(秒数)。

也就是说,要合理分配工人降低的高度,使得他们各自的工作时间最大值最小,求出这个最小的最大工作时间。

1 <= mountainHeight <= 100000。

1 <= workerTimes.length <= 10000。

1 <= workerTimes[i] <= 1000000。

输入: mountainHeight = 4, workerTimes = [2,1,1]。

输出: 3。

解释:

将山的高度降低到 0 的一种方式是:

工人 0 将高度降低 1,花费 workerTimes[0] = 2 秒。

工人 1 将高度降低 2,花费 workerTimes[1] + workerTimes[1] * 2 = 3 秒。

工人 2 将高度降低 1,花费 workerTimes[2] = 1 秒。

因为工人同时工作,所需的最少时间为 max(2, 3, 1) = 3 秒。

题目来自leetcode3296。

下面是详细的分步骤过程: 1. 理解问题和关键关系

  • • 每个工人 i 降低高度 x,需要时间:
    workerTimes[i] × (1 + 2 + ... + x) = workerTimes[i] × x × (x + 1) / 2

  • • 所有工人同时开始工作,每个工人的工作时间可能不同。最终完成时间是所有工人工作的最大值。

  • • 目标是找到最小的时间T,在时间T内,所有工人合起来能至少降低mountainHeight的高度。

2. 将问题转换成判定问题
  • • 给定某个时间T,判定是否存在一个分配方案使得所有工人在 ≤T的时间内,总计降低高度至少mountainHeight

  • • 对于工人 i,在时间限制T下,能降低的最大高度是多少?根据时间公式:
    时间 = workerTimes[i] × x × (x + 1) / 2 ≤ T
    解这个不等式求x

  1. 1. 令M = T / workerTimes[i]

  2. 2. 则:x² + x - 2M ≤ 0

  3. 3. 解这个二次不等式,最大整数x为:
    x = floor((√(1 + 8M) - 1) / 2)

3. 二分搜索的思路
  • • 最少时间的下界是 1 秒(至少需要1秒才能开始工作)。

  • • 上界是一个较大的时间,比如某个工人单独完成全部工作所需最大时间的保守估计。

  • • 用二分搜索在时间范围里寻找最小的时间midTime,根据步骤2对每个工人计算其最大降低高度,如果所有工人的降低高度之和 ≥mountainHeight,说明可以在该时间或更短时间完成。

  • • 如果不能完成,则需要增加时间;如果能完成,则尝试降低时间。

4. 具体步骤描述

步骤 1:初始化二分查找范围

  • • 计算最大工时:
    找出 workerTimes 中的最大工作时间 maxT。

  • • 计算最坏情况下某工人单独降低所有高度需要的时间上限:假设每个工人分担平均高度h = (mountainHeight - 1) / len(workerTimes) + 1
    那么最大时间上界大约是:
    maxT * h * (h + 1) / 2

步骤 2:进行二分搜索

  • • 利用sort.Search或经典二分搜索,在区间[1, maxTime]之间尝试时间m

步骤 3:判断函数

  • • 对于给定时间m,计算每个工人在m时间下最大能降低高度:
    根据公式:x = floor((√(1 + 8 * (m / workerTimes[i])) - 1) / 2)

  • • 累加所有工人的最大降低高度,得到总降低量totalLoweredHeight

  • • 如果totalLoweredHeight >= mountainHeight,函数返回true表示时间m足够。

  • • 否则返回false

步骤 4:根据判断结果调整搜索区间

  • • 如果时间m足够,尝试缩小区间向左搜索更小时间。

  • • 否则向右搜索更大时间。

步骤 5:最终返回最小满足条件的时间

  • • 二分搜索结束时返回找到的最小时间。

总体时间复杂度分析
  • • 二分搜索的次数是O(log(maxTime)),其中maxTime是最大时间界限,大致与山高度 * 最大工作时间成正比(但常数相对较大)。

  • • 每次二分判断函数中需要遍历所有n个工人,计算每个人最大降低高度,复杂度是O(n)

  • • 因此总时间复杂度为O(n log maxTime)

其中:

  • n是工人数,最大 10000,

  • maxTime最大可能很大,因为workerTimes[i]最大可达 10^6,mountainHeight最大 10^5,但log操作使得其可接受。

空间复杂度分析
  • • 除了存储输入的 workerTimes 和常量空间外,没有使用额外占用多倍大小的空间。

  • • 主要使用O(n)空间存储 workerTimes 和少量临时变量。

  • • 因此额外空间复杂度是O(n)

总结

步骤

描述

问题转为判定是否给定时间内可完成任务

给定时间T,计算每个工人最大降低高度求和是否≥山高

二次方程求每个工人在时间限制下最大可降低高度

利用公式x = floor((√(1+8M)-1)/2),其中M = T / workerTimes[i]

二分搜索时间区间寻找最优时间

利用二分法从时间区间中定位最小满足要求的时间

每次判定遍历工人计算高度

时间复杂度O(n)

总时间复杂度

O(n log(maxTime))

总空间复杂度

O(n)

这样就实现了高效求解工人同时完成降山任务的最短时间。

Go完整代码如下:

package main import (     "fmt"     "math"     "slices"     "sort" ) func minNumberOfSeconds(mountainHeight int, workerTimes []int)int64 {     maxT := slices.Max(workerTimes)     h := (mountainHeight-1)/len(workerTimes) + 1     ans := 1 + sort.Search(maxT*h*(h+1)/2-1, func(m int)bool {         m++         leftH := mountainHeight         for _, t := range workerTimes {             leftH -= (int(math.Sqrt(float64(m/t*8+1))) - 1) / 2             if leftH <= 0 {                 returntrue             }         }         returnfalse     })     returnint64(ans) } func main() {     mountainHeight := 4     workerTimes := []int{2, 1, 1}     result := minNumberOfSeconds(mountainHeight, workerTimes)     fmt.Println(result) }

Python完整代码如下:

# -*-coding:utf-8-*- import math defmin_number_of_seconds(mountain_height: int, worker_times: list[int]) -> int:     max_t = max(worker_times)     h = (mountain_height - 1) // len(worker_times) + 1     defcan_finish(m: int) -> bool:         left_h = mountain_height         for t in worker_times:             # 等效于 Go 代码的:(int(math.Sqrt(float64(m/t*8+1))) - 1) / 2             count = (int(math.isqrt(m // t * 8 + 1)) - 1) // 2             left_h -= count             if left_h <= 0:                 returnTrue         returnFalse     left, right = 1, max_t * h * (h + 1) // 2     while left < right:         mid = (left + right) // 2         if can_finish(mid):             right = mid         else:             left = mid + 1     return left if __name__ == "__main__":     mountain_height = 4     worker_times = [2, 1, 1]     result = min_number_of_seconds(mountain_height, worker_times)     print(result)

我们相信 Go 语言和算法为普通开发者提供了强有力的“面试利器”,并致力于分享全面的编程知识。在这里,您可以找到最新的 Go 语言教程、算法解析、提升面试竞争力的秘籍以及行业动态。 欢迎关注“福大大架构师每日一题”,让 Go 语言和算法助力您的职业发展

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
小鹏真把“大湾区揽胜”造出来了!官方:6座全是C位

小鹏真把“大湾区揽胜”造出来了!官方:6座全是C位

网上车市
2026-02-12 10:16:03
谷歌DeepMind哈萨比斯:10至15年内,人类将迎来新的黄金时代

谷歌DeepMind哈萨比斯:10至15年内,人类将迎来新的黄金时代

IT之家
2026-02-12 21:32:05
汪家双喜临门!筱梅深夜开播:宝宝姓名已定,汪小菲定下陪产计划

汪家双喜临门!筱梅深夜开播:宝宝姓名已定,汪小菲定下陪产计划

未曾青梅
2026-02-14 20:20:21
宋威龙赵今麦官宣,热搜爆了

宋威龙赵今麦官宣,热搜爆了

背包旅行
2026-02-12 15:04:29
揪心!谷爱凌脑出血休克,癫痫发作濒死边缘,母亲泪崩曝细节

揪心!谷爱凌脑出血休克,癫痫发作濒死边缘,母亲泪崩曝细节

古事寻踪记
2026-02-06 07:13:45
41岁再砍三双!里夫斯:詹姆斯有资格心情不好,但他从不

41岁再砍三双!里夫斯:詹姆斯有资格心情不好,但他从不

大眼瞄世界
2026-02-14 21:02:39
好搞笑!甄子丹喜提极氪009,4s店请10位演员表演咏春拳,太尴尬

好搞笑!甄子丹喜提极氪009,4s店请10位演员表演咏春拳,太尴尬

小娱乐悠悠
2026-02-14 09:20:35
湖北省十堰市人大常委会原党组成员夏树应被开除党籍

湖北省十堰市人大常委会原党组成员夏树应被开除党籍

界面新闻
2026-02-14 14:33:55
儿子丢了、父亲走了、妻子跑了,央视主持张泽群如今落到这般田地

儿子丢了、父亲走了、妻子跑了,央视主持张泽群如今落到这般田地

蜉蝣说
2026-01-31 15:10:43
加拿大冰壶男队比赛中用手作弊,被发现后双方互相辱骂

加拿大冰壶男队比赛中用手作弊,被发现后双方互相辱骂

懂球帝
2026-02-14 20:00:10
梁朝伟窘态曝光!手足无措像个孩子,眼神无助向老婆求救

梁朝伟窘态曝光!手足无措像个孩子,眼神无助向老婆求救

澳洲红领巾
2026-02-13 14:45:33
美国华人直言:中国手机扫码支付是最不智能的发明!

美国华人直言:中国手机扫码支付是最不智能的发明!

阿伧说事
2026-01-20 12:53:01
你敢信?一群刚从中国回去的老外,对着自家的西餐,愣是吃不了了

你敢信?一群刚从中国回去的老外,对着自家的西餐,愣是吃不了了

老谢谈史
2026-02-06 12:36:54
春节还剩3天,社会上却出现这个“反常现象”,今年过年大变样?

春节还剩3天,社会上却出现这个“反常现象”,今年过年大变样?

不写散文诗
2026-02-14 16:56:37
装有线电视的注意!2026收费规则调整,别再白交冤枉钱

装有线电视的注意!2026收费规则调整,别再白交冤枉钱

小蜜情感说
2026-02-14 20:17:49
俄军小队被己方消灭?现在连“电报”也不能用了,克宫清理啦啦队

俄军小队被己方消灭?现在连“电报”也不能用了,克宫清理啦啦队

鹰眼Defence
2026-02-14 12:39:50
泰国大选大反转来了!输家变赢家?佩通坦辞职后,为泰党笑到最后

泰国大选大反转来了!输家变赢家?佩通坦辞职后,为泰党笑到最后

爱意随风起呀
2026-02-14 15:35:18
美团2025年预计亏损超200亿,若美团倒闭,3大影响将很快发生!

美团2025年预计亏损超200亿,若美团倒闭,3大影响将很快发生!

艺利森
2026-02-14 09:22:53
输27分+惨遭四杀!曾经联盟的未来门面,真的要解散吗?

输27分+惨遭四杀!曾经联盟的未来门面,真的要解散吗?

体育新角度
2026-02-14 10:54:44
东方卫视引进《成长的烦恼》,大年初一开播

东方卫视引进《成长的烦恼》,大年初一开播

北青网-北京青年报
2026-02-14 12:18:03
2026-02-14 22:36:49
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1128文章数 57关注度
往期回顾 全部

科技要闻

字节跳动官宣豆包大模型今日进入2.0阶段

头条要闻

王毅:日本如果再赌一次 只能败得更快输得更惨

头条要闻

王毅:日本如果再赌一次 只能败得更快输得更惨

体育要闻

最戏剧性的花滑男单,冠军为什么是他?

娱乐要闻

田亮一家新年全家福!森碟变清纯少女

财经要闻

谁在掌控你的胃?起底百亿"飘香剂"江湖

汽车要闻

星光730新春促销开启 80天销量破2.6万台

态度原创

游戏
艺术
数码
家居
军事航空

回归正常审美的守望先锋新英雄,把外网逆天群体急破防了

艺术要闻

第九届全国画院美展 部分油画特邀作品

数码要闻

ROG联名HiFiMAN:电竞顶流遇上HiFi老炮,游戏耳机成为新战场

家居要闻

中古雅韵 乐韵伴日常

军事要闻

钓鱼岛、黄岩岛、仁爱礁已充满中国年味

无障碍浏览 进入关怀版