zoukankan      html  css  js  c++  java
  • [每日一题2020.06.17] leetcode周赛T3 #5438 二分搜索

    题目链接

    这题我开始一直在想如何在数组上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;
    }
    
  • 相关阅读:
    java实现亲密数
    java实现亲密数
    java实现亲密数
    java实现亲密数
    java实现坐标
    java实现坐标
    java实现坐标
    java实现坐标
    java实现坐标
    spring中注解注入 context:component-scan 的使用说明
  • 原文地址:https://www.cnblogs.com/roccoshi/p/13125010.html
Copyright © 2011-2022 走看看