ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

D.二分查找-二分答案-最小化最大值——2064. 分配给商店的最多商品的最小值

2026/8/5 13:40:06 拓冰建站 浏览量
D.二分查找-二分答案-最小化最大值——2064. 分配给商店的最多商品的最小值

题目链接:2064. 分配给商店的最多商品的最小值(中等)

算法原理:

解法:二分查找

45ms击败35.83%

时间复杂度O(m × logM)

此题跟下面的题👇只能说一摸一样😂,仅仅是题目换了个说法罢了

D.二分查找-二分答案-求最小——875. 爱吃香蕉的珂珂

都可以想象成:把m根木棍切分成n段(长度可为0),让最长的那根木棍尽量短

①目标变量:木棍最长长度

②目标条件:找一个木棍长度x,使得这n段木棍都≤x,我们要让x尽量小

③转换逻辑:当木棍长度为mid时,是否这n段木棍都≤mid

具体步骤:

如果没有木棍,或者每个木棍长度都为0,直接返回0

①确定边界:

left:1,一方面最小的最大木棍长度至少为1,另一方面避免后续除法报错,所以不能为0

right:m根木棍的最大值,因为题目要求"每个商店最多只能有一种商品"

②确定二分模型:木棍最长长度 ↑ 目标条件符合度 ↓ 呈负相关单调,由于让木棍最长长度尽量,因此采用最左端点模型

③check方法设计:判断当木棍长度为mid时,是否这n段木棍都≤mid,如果当前木棍能够被完整的分开,就累加上分开的段数,如果不能完全分开,有一小块剩下的,那么这一小块剩下的也要算上一段,累加在一起,如果段数≤n,就返回true,否则返回false

Java代码:

class Solution { public int minimizedMaximum(int n,int[] q) { if(n==0||q.length==0) return 0; int left=1,right=0; for(int x:q) right=Math.max(right,x); while(left<right){ int mid=left+(right-left)/2; if(!check(mid,n,q)) left=mid+1; else right=mid; } return left; } private boolean check(int mid,int n,int[] q){ int cnt=0; for(int x:q){ if(x%mid==0) cnt+=(x/mid); else cnt+=(x/mid)+1; } return cnt<=n; } }