最大值最小或最小值最大——二分
以二分的中间值,作为间距去摆放球。如果摆放的球数 >=m, 可认为需要增加球间距 (同时保存中间值作为候选答案); 否则需要减少球间距。
两球的最小距离的最小值,是1;最小距离的最大值是 (最后位置的球坐标 - 最前位置的球坐标) / (球数-1),这里需要先对position数组排序,那么易得最小球间距离的最大值为 (position[position.length - 1] - position[0]) / (m-1)
参考题解区大佬
注意二分查找细节
class Solution:
def maxDistance(self, position: List[int], m: int) -> int:
position.sort()
l, r = 0, position[-1]
while l <= r:
mid = l + (r-l)//2
cnt=1
last = position[0]
for i in range(1,len(position)):
if position[i]-last>=mid:
cnt += 1
last = position[i]
if cnt>=m:
l = mid+1
else:
r = mid-1
return r
5490. 吃掉 N 个橘子的最少天数
提示:1 <= n <= 2*10^9
抽象为求0-n的最短路径,BFS
dp的话,需要从0循环到n,会超时
class Solution:
def minDays(self, n: int) -> int:
if n==0 or n==1:
return 1
if n==2 or n==3:
return 2
queue = []
queue.append([n,1])
visited = set()
while queue:
m,step = queue.pop(0)
if m in visited:
continue
if m==1: return step
step += 1
queue.append([m-1,step])
if m%2==0:
queue.append([m//2,step])
if m%3==0:
queue.append([m//3,step])
visited.add(m)
return -1
unordered_map底层是哈希表,增删时间复杂度是O(1)
相关题目
Acwing 100. 增减序列
TODO
410. 分割数组的最大值
https://leetcode-cn.com/problems/split-array-largest-sum/solution/er-fen-cha-zhao-by-liweiwei1419-4/
TODO