【二分值域】Leetcode1760. 袋子里最少数目的球

1760.png

这题体现了二分的一种典型应用: “猜答案”

如果没做到类似的题,很难第一时间想到用二分去处理,针对这类问题只有多总结,找到不同题目间共性,把本质提取出来,才能在第一时间条件反射般看出它是二分。

拿这道题来说,抓准题目中的关键字:【最大值】,【最小】

即使得,满足要求的答案的最大值最小。首先直观感受是,这个最大值太模糊了,根本不知道具体怎么去取这个最大值,怎么定义什么样的值才算最大值,怎么样才能找到那个尽可能大的值,而且保证最大值之间取最小。

如果看完题目有上面的困惑时,这个时候再回看题目的限制条件,这个限制条件就是我们去找那个所谓的 “最大值” 的唯一途径。

题目的限制条件是:将其中一个袋子(数组中的每个元素表示一个袋子)里的球,分到 2 个袋子中去,并且还加了一个非常重要的限制:操作次数,即如果操作次数大于1,我们再分多次
以样例为例:起初只有一个袋子,袋子里有9个球,分的操作次数为2,假设我们随便先分一次:
第一次:9:4 5, 即从一号袋子中拿出5个放入另外一个袋子,此时我们消耗了 1 个操作次数
第二次:这时我们选择 二号袋子(随意模拟的,只为解读题意),从二号袋子中拿3个球到 3 号袋子中,
这时三个袋子中的球分别为:4 2 3

我们要做的就是在 “随意” 模拟的过程中,把满足题目要求的值 “猜” 出来。

如何猜?
猜,也是有策略性的猜,因为数据范围比较大,为了加速猜取,我们这里就自然想到了用二分,每次排除一半不可能的值。
处理过程中的细节点,看代码注释

    int[] nums;
    int n;
    public int minimumSize(int[] _nums, int k) {
        nums = _nums;
        n = nums.length;
        int l = 1, r = (int)1e9;
        while(l < r) {
            int mid = l + r >> 1;
        /**
    这里是个重点,体现了 “猜” 字,即我们【假设】当前的 mid 就是最终我们要求的那个值,
但这个值具体是不是【最合适】的那个答案,还不一定,要做进一步验证
      **/
            if(check(mid, k)) r = mid;
            else l = mid + 1;
        }
        return l;
    }
    boolean check(int mid ,int k) {
        int cnt = 0;
        for(int x : nums) {
           /**
              假设我们最终要将每个袋子中放mid个求,那么要操作几次
  比如 x = 9, mid = 3. 即9个球,最终要保证每个袋子里【至少】有3个求,要操作几次?
  9:3 6 => 6: 3 3       可以看到一共需要两次操作,因为 9 % 3 == 0,因此需要 (9 / 3 - 1)次
  如果不能整除,比如 x = 10, mid = 3
   10: 3 7  => 7: 3 4 => 4: 3 1  从模拟过程可以看到至少需要3次,才能尽最大可能保证每个袋子有3个球,即 10/3 = 3
   **/
            cnt += x / mid;
            if(x % mid == 0) cnt--;
            //如果cnt 太大,说明操作次数过多,操作次数过多说明 mid 太小,要适当加大 mid
            if(cnt > k) return false;
        }
        return true;
    }

}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335

推荐阅读更多精彩内容