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

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

题面

leetcode题目

给你一个整数数组 bloomDay,以及两个整数 m 和 k 。
现需要制作 m 束花。制作花束时,需要使用花园中 相邻的 k 朵花 。
花园中有 n 朵花,第 i 朵花会在 bloomDay[i] 时盛开,恰好 可以用于 一束 花中。
请你返回从花园中摘 m 束花需要等待的最少的天数。如果不能摘到 m 束花则返回 -1 。

example

输入:bloomDay = [1,10,3,10,2], m = 3, k = 1
输出:3
解释:让我们一起观察这三天的花开过程,x 表示花开,而 _ 表示花还未开。
现在需要制作 3 束花,每束只需要 1 朵。
1 天后:[x, _, _, _, _] // 只能制作 1 束花
2 天后:[x, _, _, _, x] // 只能制作 2 束花
3 天后:[x, _, x, _, x] // 可以制作 3 束花,答案为 3

题解

总体思路

比较简单的一个二分答案的题,二分一下最少的天数,再判断一下能否在这个天数下达成条件即可

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <iostream>
#include <vector>
//#define _DEBUG
using namespace std;
// submit
class Solution
{
public:
int minDays(vector<int> &bloomDay, int m, int k)
{
int max = 0;
for (int i = 0; i < bloomDay.size(); i++)
{
max = max < bloomDay[i] ? bloomDay[i] : max;
}
return solve(1, max + 1, bloomDay, m, k);
}
int solve(int left, int right, vector<int> &bloomDay, int m, int k)
{
if (left > right)
{
return -1;
}

int mid = (left + right) / 2;
#ifdef _DEBUG
cout << "mid: " << mid << endl;
#endif
bool find = judge(bloomDay, mid, m, k);
#ifdef _DEBUG
cout << "find: " << find << endl;
#endif
if (find)
{
int ret = solve(left, mid - 1, bloomDay, m, k);
return ret != -1 ? ret : mid;
}
else
{
return solve(mid + 1, right, bloomDay, m, k);
}
}
bool judge(vector<int> &test, int target, int m, int k)
{
#ifdef _DEBUG
for (int i = 0; i < test.size(); i++)
{
cout << test[i] << " ";
}
cout << endl;
#endif
int count = 0;
int now = 0;
for (int i = 0; i < test.size(); i++)
{
if (test[i] <= target)
{
now++;
}
else
{
now = 0;
}
if (now == k)
{
now = 0;
count++;
}
}
#ifdef _DEBUG
cout << "count: " << count << endl;
#endif
return count >= m;
}
};

// for test
int main()
{
Solution s;
vector<int> test1{1, 10, 3, 10, 2};
cout << s.minDays(test1, 3, 1) << endl;
vector<int> test2{1, 10, 3, 10, 2};
cout << s.minDays(test2, 3, 2) << endl;
vector<int> test3{7, 7, 7, 7, 12, 7, 7};
cout << s.minDays(test3, 2, 3) << endl;
return 0;
}
作者

Yu Leng

发布于

2021-05-09

更新于

2024-10-28

许可协议

评论