1482. 制作 m 束花所需的最少天数 (Java/c++二分查找)

Posted 醉苼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1482. 制作 m 束花所需的最少天数 (Java/c++二分查找)相关的知识,希望对你有一定的参考价值。

Java/c++二分查找

解题思路
如果答案存在,则答案在bloomDay的最小数和最大数之间,所以我们在这个区间里面二分查找即可
写一个函数判断当天数为mid时,是否可以摘m束花

Java代码:

class Solution {
    public int minDays(int[] bloomDay, int m, int k) {
		int n = bloomDay.length;
		//如果n<m*n则答案不存在
		if(n < m*k) return -1;
		//求最大值和最小值
		int left = bloomDay[0];
		int right = bloomDay[0];
		for(int i = 0; i < n; i++) {
			left = Math.min(left, bloomDay[i]);
			right = Math.max(right, bloomDay[i]);
		}
		//二分查找
		int mid = 0;
		while(left < right) {
			mid = left+(right-left)/2;
			if(isOkay(bloomDay, m, k, mid)) {
				right = mid;
			} else {
				left = mid+1;
			}
		}
		return left;
		
    }
	//当等待天数为day时,是否可以摘到m束花?
	public boolean isOkay(int[] bloomDay, int m, int k, int day) {
		//count记录连续可以摘的花数
		int count = 0;
		for(int i = 0; i < bloomDay.length; i++) {
			//如果花可以摘了
			if(bloomDay[i] <= day) {
				count++;
				//可以制作一束花了
				if(count == k) {
					count = 0;
					m--;
				}
			} else {
				count = 0;
			}
		}
		return m <= 0;
	}
}

C++代码:

class Solution {
public:
    int minDays(vector<int>& bloomDay, int m, int k) {
        int n = bloomDay.size();
		//如果n<m*n则答案不存在
		if(n < m*k) return -1;
		//求最大值和最小值
		int left = bloomDay[0];
		int right = bloomDay[0];
		for(int i = 0; i < n; i++) {
			left = min(left, bloomDay[i]);
			right = max(right, bloomDay[i]);
		}
		//二分查找
		int mid = 0;
		while(left < right) {
			mid = left+(right-left)/2;
			if(isOkay(bloomDay, m, k, mid)) {
				right = mid;
			} else {
				left = mid+1;
			}
		}
		return left;

    }
	//当等待天数为day时,是否可以摘到m束花?
    bool isOkay(vector<int>& bloomDay, int m, int k, int day) {
		//count记录连续可以摘的花数
        int count = 0;
		for(int i = 0; i < bloomDay.size(); i++) {
			//如果花可以摘了
			if(bloomDay[i] <= day) {
				count++;
				//可以制作一束花了
				if(count == k) {
					count = 0;
					m--;
				}
			} else {
				count = 0;
			}
		}
		return m <= 0;
    }
};

以上是关于1482. 制作 m 束花所需的最少天数 (Java/c++二分查找)的主要内容,如果未能解决你的问题,请参考以下文章

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

LeetCode每日一题(1482. 制作 m 束花所需的最少天数)

1482. 制作 m 束花所需的最少天数 (Java/c++二分查找)

1482. 制作 m 束花所需的最少天数 (Java/c++二分查找)

我用java刷 leetcode 1482. 制作 m 束花所需的最少天数

LeetCode1482. 制作 m 束花所需的最少天数 / 剑指 Offer 32 . 从上到下打印二叉树I/II/III