首页 > 其他分享 >二分系列(二分答案)9/14

二分系列(二分答案)9/14

时间:2024-09-14 12:55:28浏览次数:3  
标签:二分 right 14 int res num 答案 div left

一、使结果不超过阈值的最小除数

给你一个整数数组 nums 和一个正整数 threshold  ,你需要选择一个正整数作为除数,然后将数组里每个数都除以它,并对除法结果求和。(除法结果会向上取整 7/3=3)

请你找出能够使上述结果小于等于阈值 threshold 的除数中 最小 的那个。

思路:

使用二分答案来做(有固定模板)

1.

首先先判断一下要求的除数的范围。如果可以根据逻辑推断出来除数的左右边界,就可以减少复杂度。

2.

知道除数的范围之后,就可以使用二分法去查找最小的除数了。每次将mid作为参数传入check()函数中,判断当前这个除数是否满足题目要求,然后再去判断改变哪一个边界。

3.

最后返回left(left可能会不在合理的范围里面,需要判断)。注意:左闭右闭 左闭右开 左开右开 三种写法都可以。

代码:
class Solution {
    public int smallestDivisor(int[] nums, int threshold) {
        int maxValue=1;
        for(int num:nums){
            if(num>maxValue)maxValue=num;
        }
        int left=0;
        int right=maxValue+1;
        while(left+1<right){
            int mid=left+(right-left)/2;
            if(getSum(nums,mid)>threshold){
                left=mid;
            }else{
                right=mid;
            }
        }
        return right;
    }

    public int getSum(int[] nums, int div) {
        int res = 0;
        for (int num : nums) {
            if (num % div == 0)
                res += num / div;
            else
                res += (num / div) + 1;
        }
        return res;
    }
}

二、二分答案模板:

 

class Solution {
    public int smallestDivisor(int[] nums, int threshold) {

        //1.找到要求变量的左右边界
        int left=0;
        int right=maxValue+1;
        //2.答案一定就在这个范围里面,每次取中间值进行检验。
        while(left+1<right){
            int mid=left+(right-left)/2;
            if(getSum(nums,mid)>threshold){
                left=mid;
            }else{
                right=mid;
            }
        }
        return right;
    }
        
    //3.检验的函数 根据题意来写,一般不会很难

    public int getSum(int[] nums, int div) {
        int res = 0;
        for (int num : nums) {
            if (num % div == 0)
                res += num / div;
            else
                res += (num / div) + 1;
        }
        return res;
    }
}

三、制作m束花所需要的最少天数

给你一个整数数组 bloomDay,以及两个整数 m 和 k 。

现需要制作 m 束花。制作花束时,需要使用花园中 相邻的 k 朵花 。

花园中有 n 朵花,第 i 朵花会在 bloomDay[i] 时盛开,恰好 可以用于 一束 花中。

请你返回从花园中摘 m 束花需要等待的最少的天数。如果不能摘到 m 束花则返回 -1 。

思路:

按照二分答案的模板来进行分析:

第一步:需要考虑出答案所在的范围区间,根据这个条件:1 <= bloomDay[i] <= 10^9(一般可以先进行分析 分析不出来就用题目中给的)

第二步:在所给的范围区间里面进行二分查找。

第三步:需要根据题目要求写一个检验函数:比如在这道题中

需要制作m束花朵,并且每一束必须取连续的k朵花做,但是每一朵花只有在时间>bloomDay[i]才会开。

代码:
class Solution {
    public int minDays(int[] bloomDay, int m, int k) {
        // m为需要的花朵数 需要看bloomDay数组里面 在time天的时候有多少朵盛开
        // 对天数进行二分 最小: 最大:
        int left = 1;
        int right = 1000000001;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (getFlowers(bloomDay, k, mid) < m) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return left==1000000002?-1:left;
    }

    public int getFlowers(int[] bloomDay, int k, int time) {
        int flowers = 0;
        int left = 0;
        int right = 0;
        while (right < bloomDay.length) {
            if (bloomDay[right] > time) {
                left = right + 1;
            }
            if (right - left + 1 == k) {
                flowers++;
                left = right + 1;
            }
            right++;
        }
        return flowers;
    }
}

标签:二分,right,14,int,res,num,答案,div,left
From: https://blog.csdn.net/2301_78191305/article/details/142255441

相关文章

  • 代码随想录算法训练营,9月14日 | 530.二叉搜索树的最小绝对差,501.二叉搜索树中的众数,23
    530.二叉搜索树的最小绝对差题目链接:530.二叉搜索树的最小绝对差文档讲解︰代码随想录(programmercarl.com)视频讲解︰二叉搜索树的最小绝对差日期:2024-09-14想法:好好利用二叉搜索树中序遍历是有序的性质,设置一个节点表示前一个结点就能很方便的计算差值了Java代码如下:classSo......
  • 2024.9.14
    1.如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。2.访问数组中的元素是常数时间操作,或说O(1)操作。一个算法如果能在每个步骤去掉一半数据元素,如二分检索,通常它就取O(logn)时间。用strc......
  • 20240909_141725 c语言 整数类型
    整数型重点演练演练关于c99longlong类型是从c99版本开始有的C99是C语言的一个标准版本,全称为ISO/IEC9899:1999,是C语言的一个官方标准化版本,由国际标准化组织(ISO)和国际电工委员会(IEC)联合发布。C99标准在C89/ANSIC(1989年发布的C语言标准)的基础上进行了扩展和更新,引入了......
  • P10469 后缀数组(Hash+二分)
    #include<bits/stdc++.h>usingnamespacestd;#definexfirst#defineysecondtypedefpair<int,int>PII;typedeflonglongll;typedefunsignedlonglongull;typedefunsignedintuint;typedefvector<string>VS;typedefvector<int>......
  • 基础数据结构-二分变形C语言实现
    基础二分下面是一个最基础的二分搜索代码,从一个数组(数据从小到大排)中找出某元素。#include<stdio.h>//函数声明intbinarySearch(intarr[],intleft,intright,intx);intmain(){//测试数据intarr[]={2,3,4,10,40};intn=sizeof(arr)......
  • 重生之我在代码随想录刷算法第一天 | 704.二分查找、27.移除元素
    参考文献链接:代码随想录本人代码是Java版本的,如有别的版本需要请上代码随想录网站查看。704.二分查找力扣题目链接解题思路这道题明确规定了数组是有序并且不重复的,要在这样的数组中寻找一个给定值的位置不由得让我想起来以前的数学知识二分查找。所以很快确定了思路......
  • 高中老师卖卷子,大学老师卖答案,研究生老师卖厚二皮脸
    高中老师卖卷子,大学老师卖答案,研究生老师卖厚二皮脸皮在教育的不同阶段,教师的角色和行为可能会有所不同。高中老师卖卷子、大学老师卖答案以及研究生老师卖厚脸皮的现象,虽然可能是个别现象,但它们反映了不同教育阶段中存在的一些问题和挑战。高中老师卖卷子可能是出于多种原因。一......
  • 【每日一题】LeetCode 2398.预算内的最多机器人数目(滑动窗口、数组、二分查找、前缀和
    【每日一题】LeetCode2398.预算内的最多机器人数目(滑动窗口、数组、二分查找、前缀和、堆(优先队列))题目描述给定两个整数数组chargeTimes和runningCosts,分别代表n个机器人的充电时间和运行成本。再给定一个整数budget,表示预算。我们需要计算在不超过预算的情况下,最......
  • 关于 wqs 二分的一言两语
    感觉一个比较入门的题目是P2619。你要求的是恰好有\(need\)条白色边的,这个很难表示,因为如果直接跑一遍MST,你不能保证一定选了\(need\)条,有可能白色边“太好了”或者“太坏了”。但是我们发现,如果白色边“越好”,就会尽可能选白色,反之亦然。也就是说如果我们增加一个费用:给所......
  • 二分图最大权完美匹配
    问题给定一个二分图,左部有\(n\)个点,右部有\(m\)个点,边\((u_i,v_j)\)的边权为\(A_{i,j}\)。求该二分图的最大权完美匹配。转化问题可以写成线性规划的形式,设\(f_{i,j}\)表示匹配中是否有边\((u_i,v_j)\),求\[\begin{gather*}\text{maximize}\quad&\sum_{i=1}^n......