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++二分查找)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode每日一题(1482. 制作 m 束花所需的最少天数)
1482. 制作 m 束花所需的最少天数 (Java/c++二分查找)
1482. 制作 m 束花所需的最少天数 (Java/c++二分查找)
我用java刷 leetcode 1482. 制作 m 束花所需的最少天数
LeetCode1482. 制作 m 束花所需的最少天数 / 剑指 Offer 32 . 从上到下打印二叉树I/II/III