-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfruit-into-baskets.cpp
62 lines (57 loc) · 1.29 KB
/
fruit-into-baskets.cpp
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
/*
* Copyright (c) 2018 Christopher Friedt
*
* SPDX-License-Identifier: MIT
*/
#include <algorithm>
#include <unordered_map>
#include <vector>
using namespace std;
class Solution {
// https://leetcode.com/problems/fruit-into-baskets/
public:
int totalFruit(vector<int> &tree) {
const size_t N = tree.size();
if (N < 3) {
return int(N);
}
size_t largest = 0;
bool grow = true;
unordered_map<int, size_t> basket;
size_t M;
for (size_t L = 0, R = 0; L < N - 2 && R < N;) {
if (grow) {
M = basket.size();
for (; R < N && M < 2; R++) {
auto it = basket.find(tree[R]);
if (basket.end() == it) {
basket[tree[R]] = 1;
M++;
} else {
it->second++;
}
}
for (; R < N; R++) {
auto it = basket.find(tree[R]);
if (basket.end() == it) {
break;
}
basket[tree[R]]++;
}
largest = max(largest, R - L);
grow = false;
} else {
M = basket.size();
for (; L < R && M >= 2; L++) {
basket[tree[L]]--;
if (0 == basket[tree[L]]) {
basket.erase(tree[L]);
M--;
}
}
grow = true;
}
}
return int(largest);
}
};