难度指数:⭐⭐⭐
知识点:二分法
通用一般算法:
【100%通过率】华为OD机试真题 Python 实现【种树】【2023 Q2 | 100分】
def solve(position, m):
def count(num):
stack=[position[0]]
cnt=1
while True:
index=bisect.bisect(position,stack.pop()+num)
if index==len(position):break
stack.append(position[index])
cnt+=1
return cnt
l,r=1,position[-1]//(m-1)
while l<r:
mid=l+(r-l)//2
if count(mid)>=m:
l=mid+1
else:
r=mid
return l
创新算法
idea
- 以初始上限更小,下限更大为原则。
代码实现
def solve0(nums):
l = 1
r = (nums[-1] - nums[0]) // (tree - 1) + 1
while l < r - 1:
flag = True
mid = (l + r) // 2
temp = 1
lt = nums[0]
for i in range(1, hole):
if nums[i] - lt >= mid:
temp += 1
lt = nums[i]
if temp == tree:
flag = False
break
if flag:
r = mid
else:
l = mid
return l
对比验证
耗时:
from time import time
import random, bisect
def solve(position, m):
def count(num):
stack=[position[0]]
cnt=1
while True:
index=bisect.bisect(position,stack.pop()+num)
if index==len(position):break
stack.append(position[index])
cnt+=1
return cnt
l,r=1,position[-1]//(m-1)
while l<r:
mid=l+(r-l)//2
if count(mid)>=m:
l=mid+1
else:
r=mid
return l
def solve0(nums):
l = 1
r = (nums[-1] - nums[0]) // (tree - 1) + 1
while l < r - 1:
flag = True
mid = (l + r) // 2
temp = 1
lt = nums[0]
for i in range(1, hole):
if nums[i] - lt >= mid:
temp += 1
lt = nums[i]
if temp == tree:
flag = False
break
if flag:
r = mid
else:
l = mid
return l
T = 10
while T:
nums = [random.randint(0, 1e5) for _ in range(random.randint(2, 1e4))]
nums = list(set(nums))
hole = len(nums)
nums.sort()
tree = random.randint(2, hole)
t1 = time()
res0 = solve0(nums)
t2 = time()
res = solve(nums, tree)
t3 = time()
if res != res0:
print(res, res0)
print(t3 - t2, t2 - t1)
T -= 1