![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
二分法
文章平均质量分 58
algsup
这个作者很懒,什么都没留下…
展开
-
[二分答案]leetcode668:乘法表中第k小的数(hard)
题目:题解:思路:二分答案求第几小等价于求有多少数字不超过 x。我们可以遍历乘法表的每一行,对于乘法表的第 i 行,其数字均为 i 的倍数,因此该行中不超过 x 的数字个数为 min(x/i,n),然后遍历这 m 行求小于等于 x 的数字个数即可。代码如下:class Solution {public: int findKthNumber(int m, int n, int k) { // 对于乘法表中第i行,其数字均为i的倍数,因此每行中不超过x的数的个数原创 2022-05-18 09:08:22 · 132 阅读 · 0 评论 -
[二分答案]leetcode1482:制作 m 束花所需的最少天数(medium)
题目:题解:首先解读下题意:有 n 朵花,每朵花 i 在 a[i] 时刻进行开放,所以给定一个时间 t,判断花 i 是否开放,即需判断 a[i]<=t 是否成立即可。然后我们根据这个,来二分寻找满足题意的最少时间。思路:二分答案转化为判定题目要求是求至少制作 m 束花所需的最少天数,设为 res,那么天数在 [0,res) 内无法完成制作,天数在 [res,+∞) 可以完成制作。二分的精准边界:下界为最早开花的时间,上界为最晚开花的时间。二分的模糊边界:下界为0,表示尚未有花开放原创 2022-04-05 15:44:54 · 313 阅读 · 0 评论 -
[二分答案]leetcode2226:每个小孩最多能分到多少糖果(medium)
题目:题解:思路:类比 2187. 完成旅途的最少时间 使用二分法,二分查找至少分成 k 份的最大糖果数。二分查找的边界:下界为 0,表示 k 份都是 0 个糖果;上界为 sum(a)/k,表示所有糖果分成 k 份,每份的糖果数。至少分成 k 份的最大糖果数,就在这个区间内进行二分即可。每次判断 mid 值能否将 a 中每堆糖果按每份 mid 个分成大于等于 k 个人,然后来缩小区间即可。代码如下:using LL = long long;class Solution {pub原创 2022-04-03 19:23:03 · 962 阅读 · 0 评论 -
[二分法]leetcode2187:完成旅途的最少时间(medium)
题目:题解:思路:二分法关于如何想到使用二分时间t呢?首先题目说的是给定一个时间 t,然后求每辆公交车可以在这个时间t内能完成的旅途数,用t/a[i]来表示第i辆公交车在时间t内能完成的旅途数。显然时间 t 越长,每辆车在时间 t 内完成的旅途数越多,当然可以使用 二分 来寻找大于等于 tot 个旅途数的最少时间了。关于二分的上下界:由于我们至少需要1个时间来完成至少一次旅途,因此下界为 1;而对与二分查找的上界,出于对方便计算的考虑,可以将花费时间最长的公交车完成 tot 躺原创 2022-04-03 16:59:29 · 530 阅读 · 0 评论 -
[二分]leetcode5983:同时运行 N 台电脑的最长时间(hard)
题目:题解:本题的难点在于如何思考 n台电脑的最大运行时间 具有单调性的,我们的二分就是利用这个单调性进行求解最佳答案的。关于答案的证明,可以看以下证明过程。证明出n*mid(x)<=sum的正确性后,我们将其封装为一个check函数,然后套用寻找小于target的最大位置的二分板子即可。代码如下:class Solution {public: using LL = long long; long long maxRunTime(int n, vector原创 2022-01-16 20:03:35 · 434 阅读 · 0 评论 -
[二分法]leetcode1760:袋子里最少数目的球(medium)
题目:题解:本题要有二分的思想很重要,y总说过算法题都不可能是现场想出来的,一般都是见过原型,然后做出来的。本题需要转换思路:给定 maxOperations 次操作次数,能否可以使得单个袋子里球数目的最大值不超过 y。注意这里的 (x-1)/y 的 x 之所以要减1,是因为当 x 和 y 相等时,我们时需要进行分堆的。这里将一下二分法:1)若mid满足条件check,表示mid分x的话满足最大次数,我们向左逼近来寻找更小的mid,由于mid可能为目标值,我们取 r=mid。原创 2021-02-14 22:35:48 · 317 阅读 · 1 评论 -
[二分法]leetcode540:有序数组中的单一元素(medium)
题目:题解:二分法由于本题数组长度为奇数,并且我们想要找到单一元素的话,每次二分区间也只能在长度为奇数的子数组查找,所以mid每次都能将数组分成长度相等的子数组,分为以下2大情况(4小情况)来讨论:1)若num[mid]==nums[mid+1]表示中间元素的相同元素在右边,我们可根据左右子数组的长度来确定下次搜索区间:1.1)左右子数组长度为偶数时,那么我们在右子数组中寻找单一元素,因为右子数组长度为偶数,我们减去nums[mid+1]之后,右子数组长度为奇数了,那么单一元素必然原创 2021-01-10 20:27:26 · 211 阅读 · 0 评论 -
[二分法]leetcode1170:比较字符串最小字母出现频次(easy)
题目:题解:使用二分法模板二,首先遍历words统计最小字母出现的频率,然后将频率表进行排序,遍历二分查找。最后在遍历queries,使用二分法在频率表寻找大于queries中单词最小频率的最小值,然后添加个数即可。代码如下:class Solution {public: vector<int> numSmallerByFrequency(vector<...原创 2020-01-31 23:27:37 · 324 阅读 · 0 评论 -
[二分答案]leetcode1011:在 D 天内送达包裹的能力(medium)
题目:1011. 在 D 天内送达包裹的能力题解:使用二分法的模板二,二分区间为[包裹的最大值,包裹的总重量],每次二分需要根据mid来计算需要的天数,若天数小于等于D,表示mid值取得过大了,我们需要向左逼近区间[left,mid];若天数大于D,表示mid取得较小,我们需要向右逼近区间[mid+1,right]。代码如下:class Solution {public:...原创 2020-01-25 13:23:23 · 390 阅读 · 0 评论 -
[二分法]leetcode1157:子数组中占绝大多数的元素(hard)
题目:题解:二分法使用map来存放<元素值,等于该元素值的所有下标>,调用query()时,我们需要遍历map使用二分法来获得[left,right]内的元素个数,若元素个数大于等于thresshold,则我们直接返回该元素值;否则我们继续遍历map,直到遍历完成都没找到合适的值,则返回-1。代码如下:class MajorityChecker {private:...原创 2020-01-23 19:57:12 · 427 阅读 · 0 评论 -
[二分法]leetcode1201:丑数 Ⅲ (medium)
题目:题解:二分法小于等于数值n的丑数个数为:n/a+n/b+n/c-n/ab的最小公倍数-n/ac的最小公倍数-n/bc的最小公倍数+n/三者的最小公倍数。因此我们先求出ab、ac、bc、abc的最小公倍数,由于C++17已经将两个整数最小公倍数函数lcm(a,b)加入标准库中,所以我们可以很方便的调用这个函数就好了,当然也可以自己实现。代码如下:class Solution...原创 2020-01-23 16:13:13 · 415 阅读 · 0 评论 -
[二分法]leetcode1095:山脉数组中查找目标值(hard)
题目:1095. 山脉数组中查找目标值题解:三次二分法寻找山脉数组中的目标值,第一次二分:使用二分法的模板Ⅱ,寻找数组的山峰,将数组分为前半部分升序的数组和后半部分降序的数组第二次二分:在前半部分升序数组中继续使用二分法的模板Ⅱ,寻找大于等于x的最小值第三次二分:若在前半部分没有找到x,那么我们需要使用二分法的模板Ⅱ对后半部分降序数组中寻找x代码如下:class Sol...原创 2020-01-23 11:35:48 · 669 阅读 · 0 评论 -
[二分法]leetcode981:基于时间的键值存放(mudium)
题目:981. 基于时间的键值存储题解:二分法:寻找小于等于x的最大值,可以转换为寻找大于x的最小值,这样大于x的最小值的前一个就是小于等于x的最大值了。思路:将<key,val,time>存在放一个unordered_map<string,map<int,string>>map中,在get(key,timestamp)使用map的二分查找函数u...原创 2020-01-23 11:17:29 · 323 阅读 · 0 评论 -
[二分法]leetcode81:搜索旋转排序数组 II (medium)
题目:题解:二分法本题与旋转螺旋数组的区别在于nums可能存在重复元素,所以我们需要去重后再使用标准的二分法框架。nums[mid]>=nums[left]表示左半部分有序,我们需要在左半部分寻找target,这里分为两种情况,第一种target落在左半边,第二种在左半部分没有找到target,就需要在右半部分寻找。同理nums[mid]<=num[right]表示右半部分...原创 2019-12-23 10:02:03 · 251 阅读 · 0 评论 -
[数组][二分法]leetcode74:搜索二维矩阵(medium)
题目:题解:题解1:暴力法,直接遍历寻找目标值题解2:缩小领域法,从数组左下角向右上角寻找目标值题解3:二分法,将二维矩阵拖为一维矩阵,然后利用标准的二分查找就好了,注意一下一维和二维坐标之间的转换就好代码如下:class Solution {public: //题解1:暴力法 bool searchMatrix_1(vector<vector<...原创 2019-12-18 15:18:03 · 210 阅读 · 0 评论 -
[二分法]leetcode704:二分查找(easy)
题目:题解:本题是二分查找的裸题,也是最标准的二分法的模板1,循环结束的条件为区间内的元素数量为0。代码如下:class Solution {public: int search(vector<int>& nums, int target) { if(nums.empty())return -1; int begin=0,...原创 2019-12-18 15:08:49 · 275 阅读 · 0 评论 -
[二分法]leetcode378:有序矩阵中第K小的元素(medium)
题目:题解:题解1:暴力法,将二维矩阵转换为一维矩阵,然后排序,最后直接返回第k小元素就好了。题解2:二分法,我们以数组元素的最小最大值作为二分查找的左右边界,然后根据小于等于mid值的元素个数来划分每次二分查找得区间。若小于mid值的元素小于k,那么第k小的元素肯定在右边界且不包含mid值,所以left=mid+1;若小于等于mid值得元素个数大于等于k,那么第k小的元素肯定在...原创 2019-12-16 20:09:41 · 230 阅读 · 0 评论 -
[二分法]leetcode875:爱吃香蕉的珂珂(medium)
题目:875. 爱吃香蕉的珂珂题解:二分法与1283. 使结果不超过阈值的最小除数算法思路一模一样,大家直接看代码就好了。代码如下:class Solution {public: //题解:二分查找 //二分查找结束的条件为区间内还剩下两个数,其中右边那个数为我们所要寻找的数 int minEatingSpeed(vector<int>...原创 2019-12-09 15:46:05 · 397 阅读 · 0 评论 -
[二分法]leetcode1283:使结果不超过阈值的最小除数(medium)
题目:1283. 使结果不超过阈值的最小除数题目:本题是上周周赛的第三题,主要考察二分法的,其实也就是一道原题,与875. 爱吃香蕉的珂珂一模一样,除了数据的范围变了。算法思路如下:1)我们记函数cal(mid)为以mid作为除数,数组里每个数除以x后的累加和的函数。注意在代码实现中,我们主要使用sum来表示cal(mid)函数的值。2)易知,cal(mid)是一个单调递减的...原创 2019-12-09 15:42:53 · 481 阅读 · 0 评论 -
[前缀和+二分法]leetcode327:区间和的个数(hard)
题目:题解:前缀和+二分法注意这里使用暴力法的话,会超时的,所以我们需要改进算法。我们使用multiset的数据结构来存放前缀和,这样做的好处是自动对元素进行排序,便于二分查找。用prefix[i]表示[0,i]的前缀和,然后需要想办法找到区间[0,i]之间还有多少个区间和满足[lower,upper]的范围呢?假如[j,i]的区间和满足[lower,upper]的范围,那么lo...原创 2019-12-07 21:17:37 · 490 阅读 · 0 评论 -
[二分法]leetcode35:搜索插入位置(easy)
题目:题解:题解1:直接遍历数组寻找第一个大于等于target的数组元素下标题解2:二分法模板一。找到第一个大于等于target的值,right指向的值肯定大于target,最后结束的条件是left=right+1,也就是left指向的元素是第一个大于等于target的值。题解:class Solution {public: //解法1:暴力法 int sea...原创 2019-11-27 23:20:51 · 162 阅读 · 0 评论 -
[二分法]leetcode153:寻找旋转排序数组中的最小值(medium)
题解:题解:class Solution {public: //解法1:二分法,时间复杂度O(n),空间复杂度O(1) int findMin_1(vector<int>& nums) { if(nums.size()==1)return nums[0]; int begin=0,end=nums.siz...原创 2019-08-27 20:16:48 · 192 阅读 · 0 评论 -
[高级二分法]leetcode410:分割数组的最大值(hard)
题目:题解:说实话这题真的挺难的,不愧为hard级别的题目。解题思路我是参考评论区大佬的,说一下我所理解的思路1)首先题目要求我们将数组划分为m个子数组,并要求这m个子数组各自和的最大值在所有情况中最小,那么m个子数组各自和的最大值必定在max(nums)和sum(nums)这个区间范围内,所以我们就要利用二分法来划分此区间范围,begin=max(nums);end=sum(nums...原创 2019-08-29 13:51:55 · 335 阅读 · 0 评论 -
[二分法]leetcode719:找出第k小的距离对(hard)
题解:题解:本题也是二分法中很难的题了,看题是寻找第k小的距离对。那我们需要二分确定一个中间数,然后找到所有小于等于这个中间数的距离个数,用其跟k比较来确定折半的方向。具体算法如下:代码如下:......原创 2019-08-29 16:25:36 · 495 阅读 · 0 评论 -
[二分法]leetcode4:寻找两个有序数组的中位数(hard)
题目:题解:又是一道hard题啊,这对于原来就很少做hard的我来说,可以说是很锻炼人了,坐下来静心思考,拿纸笔画结果,写推导过程,终于把这道题搞定了。思路:二分法,中位数就是将数组划分为长度相等的两段。1)对于长度为奇数的数组,中位数就是最中间的那个数;对于长度为偶数的数组,中位数就是最中间的两个数的和除以2。也就是说中位数将数组分成长度相等的两段了。2)对于两个有序数组的中位数...原创 2019-08-29 21:55:47 · 1031 阅读 · 0 评论 -
[二分法]leetcode34:在排序数组中查找元素的第一个和最后一个位置(medium)
题目:题解:class Solution {public: //解法1:STL算法,时间复杂度为0(n),空间复杂度为O(1) vector<int> searchRange_1(vector<int>& nums, int target) { if(nums.empty())return {-1,-1}; v...原创 2019-09-02 22:53:40 · 269 阅读 · 0 评论 -
[二分法][三分法]leetcode374:猜数字大小(easy)[补充二分法为什么比三分法更广泛使用]
题目:题解:原创 2019-08-27 09:38:27 · 684 阅读 · 0 评论 -
[二分法]leetcode287:寻找重复数(medium)
题目:题解:class Solution {public: //解法1:暴力法解题,平均时间复杂度为O(nlogn),空间复杂度为O(1) int findDuplicate_1(vector<int>& nums) { sort(nums.begin(),nums.end()); for(int i=0;i<num...原创 2019-08-29 22:52:04 · 283 阅读 · 0 评论 -
[二分法]leetcode278:第一个错误的版本(easy)
题目:t原创 2019-08-27 21:03:09 · 205 阅读 · 0 评论 -
[二分法]leetcode33:搜索旋转排序数组(medium)
题解:题解:class Solution {public: //解法1:STL算法,时间复杂度O(n),空间复杂度O(1) int search_1(vector<int>& nums, int target) { auto it=find(nums.begin(),nums.end(),target); if(it!=nu...原创 2019-08-27 10:46:44 · 196 阅读 · 0 评论 -
[二分法]leetcode744:寻找目标字母大地最小字母(easy)
题目:题解:class Solution {public: char nextGreatestLetter(vector<char>& letters, char target) { //target比尾元素要大,返回首元素 if(target>=letters.back())return letters.front();...原创 2019-08-28 20:19:16 · 171 阅读 · 0 评论 -
[二分法]leetcode658:找到k个最接近的元素(medium)
题目:题解:class Solution {public: //题解1:由题意可知,需在长度为n的序列中寻找长度为k的子序列,这样我们就可直接在总序列中删掉n-k个元素 //删除元素是从两端开始删除的,距离x值较远的元素删除,较近的元素保留,最终直到result的大小为k时,循环终止 //时间复杂度O(n-k),空间复杂度为O(k) vector<i...原创 2019-08-28 17:09:12 · 344 阅读 · 0 评论 -
[二分法][等差公式]leetcode367:有效地完全平方数(easy)
题解:题解:class Solution {public: //解法1:库函数 bool isPerfectSquare_1(int num) { int x=sqrt(num); return x*x==num; } //解法2:公式法,1+3+5+7+9+…+(2n-1)=n^2 bool isPerfe...原创 2019-08-28 18:21:29 · 204 阅读 · 0 评论 -
[二分法]leetcode162:寻找峰值(medium)
题解:题解:class Solution {public: //解法1:二分法,时间复杂度O(logn),空间复杂度O(1) //算法思路:沿着相邻元素增大的方向寻找一定能找到峰值 int findPeakElement_1(vector<int>& nums) { int begin=0,end=nums.size()-1; ...原创 2019-08-27 20:53:17 · 300 阅读 · 0 评论 -
[二分法]leetcode154:寻找旋转排序数组中的最小值Ⅱ(hard)
题目:题解:class Solution {public: //解法1:STL算法 int findMin_1(vector<int>& nums) { return *min_element(nums.begin(),nums.end()); } //解法2:二分法 //和 I 的做法类似, 都是二分法...原创 2019-09-02 23:20:16 · 187 阅读 · 0 评论 -
[二分法]leetcode69:x的平方根(easy)
题目:题解:class Solution {public: //解法1:二分法 int mySqrt_1(int x) { long long left=1,right=x/2+1;//对于一个非负数n,它的平方不会大于n/2+1 while(left<=right) { long lo...原创 2019-08-26 23:07:47 · 240 阅读 · 0 评论