又是一周力扣赛
我这里犯了个错误,我开始认为sort一下,然后对最快的工人进行"压榨",完成mount高的山就是最少秒数。
class Solution:
def minNumberOfSeconds(self, mountainHeight: int, workerTimes: List[int]) -> int:
workerTimes.sort()
return workerTimes[0]*mountainHeight*(mountainHeight+1)/2
包错误的。
正确思路应该是使用二分查找,查找对象为时间,然后再根据设定的时间来查看是否完成工作。
class Solution:
def minNumberOfSeconds(self, mountainHeight: int, workerTimes: List[int]) -> int:
def finish(timelimit):
#检查工作是否完成
#注意是工人同时工作
total=0
for time in workerTimes:
x = 0
while (time * (x + 1)) <= timelimit:
x += 1
total+=x
return total>=mountainHeight
left,right=0,max(workerTimes)*mountainHeight
while left<right:
mid=(left+right)//2
if finish(mid):
#继续查找更小
right=mid
else:
left=mid+1
return left
不能这样算,唉,ai也挺逆天的。
这样基于时间求高度是本末倒置,浪费时间复杂度的。
不对,貌似计算公式错误了。
原来是求根公式
class Solution:
def minNumberOfSeconds(self, mountainHeight: int, workerTimes: List[int]) -> int:
def finish(timelimit):
#检查工作是否完成
#注意是工人同时工作
total = 0
for wt in workerTimes:
delta = 1 + 8 * timelimit / wt
if delta < 0:
continue
x = int((math.isqrt(int(delta)) -1) //2)
total += x
if total >= mountainHeight:
return True
return total>=mountainHeight
left,right=0,max(workerTimes)*mountainHeight*(mountainHeight+1)//2
while left<right:
mid=(left+right)//2
if finish(mid):
#继续查找更小
right=mid
else:
left=mid+1
return left