码迷,mamicode.com
首页 > 其他好文 > 详细

[每日一题2020.06.17] leetcode周赛T3 5438 制作m束花所需的最少天数 二分搜索

时间:2020-06-14 16:45:45      阅读:58      评论:0      收藏:0      [点我收藏+]

标签:log   二分搜索   固定   特性   搜索   复杂   https   nim   als   

题目链接

这题我开始一直在想如何在数组上dp操作搜索区间, 很蠢, 实际上用二分查找的方法可以很快的解决

首先我们通过一个函数判断第x天是否符合题意, 如果x天可以做出m束花, 那么大于m的天数必然可以.

从这里便可以看出其符合二分搜索的特性 :

  1. 答案在一个固定区间内;
  2. 可能查找一个符合条件的值不是很容易,但是要求能比较容易地判断某个值是否是符合条件的;
  3. 可行解对于区间满足一定的单调性。

由于题目设定的最大值是1e9, 我们可以直接把二分的左端设置为0, 右端设置为1e9

判断x天是否满足条件的函数复杂度为$ O(n) $ 而二分查找复杂度为$ O(logn) $ , 故总时间复杂度为$ O(nlogn)$

判断函数 :

bool can(int mid, vector<int>& b, int m, int k) {
	int cnt = 0;
	for (int i = 0; i < b.size(); ++i)
	{			
		if(b[i] <= mid)
			cnt++;
		else
			cnt = 0;
		if(cnt==k){
			cnt = 0;
			m--;
		}
		if(m==0)
			return true;
	}
	return false;
}

搜索函数 :

int minDays(vector<int>& bloomDay, int m, int k) {
	if (k*m > bloomDay.size())
		return -1;
	int l = 0;
	int r = 1e9;
	while (l < r) {
	        //int mid = (l + r) >> 1;	这里用下面的方式更安全, 因为这种方式相加可能会溢出 (不是指这道题)
		int mid = l + ((r - l) >> 1); 
		if (can(mid, bloomDay, m, k))
			r = mid;
		else 
			l = mid + 1;
	}
	return l;
}

[每日一题2020.06.17] leetcode周赛T3 5438 制作m束花所需的最少天数 二分搜索

标签:log   二分搜索   固定   特性   搜索   复杂   https   nim   als   

原文地址:https://www.cnblogs.com/roccoshi/p/13125010.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!