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

📅 发布时间:2026/7/8 23:58:34 👁️ 浏览次数:
D.二分查找-二分答案-最小化最大值——2064. 分配给商店的最多商品的最小值
题目链接2064. 分配给商店的最多商品的最小值中等算法原理解法二分查找45ms击败35.83%时间复杂度O(m × logM)此题跟下面的题只能说一摸一样仅仅是题目换了个说法罢了D.二分查找二分答案求最小——875. 爱吃香蕉的珂珂都可以想象成把m根木棍切分成n段长度可为0让最长的那根木棍尽量短①目标变量木棍最长长度②目标条件找一个木棍长度x使得这n段木棍都≤x我们要让x尽量小③转换逻辑当木棍长度为mid时是否这n段木棍都≤mid具体步骤如果没有木棍或者每个木棍长度都为0直接返回0①确定边界left1一方面最小的最大木棍长度至少为1另一方面避免后续除法报错所以不能为0rightm根木棍的最大值因为题目要求每个商店最多只能有一种商品②确定二分模型木棍最长长度 ↑ 目标条件符合度 ↓ 呈负相关单调由于让木棍最长长度尽量短因此采用最左端点模型③check方法设计判断当木棍长度为mid时是否这n段木棍都≤mid如果当前木棍能够被完整的分开就累加上分开的段数如果不能完全分开有一小块剩下的那么这一小块剩下的也要算上一段累加在一起如果段数≤n就返回true否则返回falseJava代码class Solution { public int minimizedMaximum(int n,int[] q) { if(n0||q.length0) return 0; int left1,right0; for(int x:q) rightMath.max(right,x); while(leftright){ int midleft(right-left)/2; if(!check(mid,n,q)) leftmid1; else rightmid; } return left; } private boolean check(int mid,int n,int[] q){ int cnt0; for(int x:q){ if(x%mid0) cnt(x/mid); else cnt(x/mid)1; } return cntn; } }