前言:
一般求min(max)或者max(min)类题目都可以用二分判定来求解
1552. Magnetic Force Between Two Balls
解法:
class Solution:
def maxDistance(self, position: List[int], m: int) -> int:
# 二分判定
# 二分搜索,每次二分到的值X,判断能不能取m个位置,这m个位置值之间两两的差绝对值的最小值大于这个X
# 单次判定的方法:在排好序的数组上,从头开始贪心的放球,看能不能把所有球放完
position.sort()
n = len(position)
def count(mid):
ans = 1
prev = position[0]
for i in range(1,n):
if position[i]-prev>=mid:
ans+=1
prev = position[i]
return ans
left = 0
right = position[-1]
while left+1<right:
mid = left + (right-left)//2
#print(mid)
if count(mid)>=m:
left = mid
else:
right=mid
if count(left)>=m:
return left
else:
return right
410. Split Array Largest Sum
解法:
class Solution:
def splitArray(self, nums: List[int], m: int) -> int:
def count(mid):
curr = 0
ans = 0
for i in range(len(nums)):
if curr+nums[i]<=mid:
curr += nums[i]
else:
ans += 1
if nums[i]<=mid:
curr = nums[i]
else:
return float('inf')
return ans+1
lo = 0
hi = sum(nums)+1
while lo+1<hi:
mid = lo+(hi-lo)//2
#print(mid,count(mid))
if count(mid)<=m:
hi = mid
else:
lo = mid
if count(lo)<=m:
return lo
else:
return hi
875. Koko Eating Bananas
解法:
class Solution:
def minEatingSpeed(self, piles: List[int], H: int) -> int:
def count(mid):
time = 0
for pile in piles:
div,remain = pile//mid,pile%mid
time += div
if remain:
time += 1
return time
lo = 1
hi = max(piles)+1
while lo+1<hi:
mid = lo+(hi-lo)//2
if count(mid)<=H:
hi = mid
else:
lo = mid
if count(lo)<=H:
return lo
else:
return hi
Leetcode Path With Minimum Effort
解法:
参考这里:https://blog.csdn.net/qq_37821701/article/details/109304322
follow up
其他类似题目:
774. Minimize Max Distance to Gas Station
775. Capacity To Ship Packages Within D Days
776. Divide Chocolate
777. Minimum Number of Days to Make m Bouquets
参考链接:
https://leetcode.com/problems/magnetic-force-between-two-balls/discuss/794070/Python-Binary-search-solution-with-explanation-and-similar-questions