1欲張りアルゴリズム(undered_mapを使用)
class Solution {
private:
unordered_map<int, int> map;
public:
bool lemonadeChange(vector<int>& bills) {
if (bills[0] > 5) return false;
for (auto& b : bills) {
map[b] ++;
if (b == 10) {
if (map[5] < 1) return false;
map[5] --;
}
if (b == 20) {
if ((map[10] < 1 && map[5] < 3) || (map[10] > 0 && map[5] < 1))
return false;
if (map[10] > 0) {
map[10]--;
map[5]--;
} else
map[5] -= 3;
}
}
return true;
}
};
2欲張りアルゴリズム(基本カウンターを使用)
トピックしかないため、データ構造の代わりに5,10,20
手動で3
カウンターを設定できますが、一般的にはコンテナーを使用することをお勧めします
【注意】カウンターを初期化するときは、必ずこれを行ってください。
int five = 0, ten = 0;
そして、このように怠惰にならないでください
int five, ten;
一部のコンパイラは自動的に0を初期化し、一部のコンパイラは値を直接ランダム化するため、結果が異なります。
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
if (bills[0] != 5) return false;
int five = 0, ten = 0;
for (auto& b : bills) {
if (b == 5) five++;
if (b == 10) {
if (five < 1) return false;
ten++;
five--;
}
if (b == 20) {
if (ten > 0 && five > 0) {
ten--;
five--;
} else if (ten < 1 && five >= 3)
five -= 3;
else return false;
}
}
return true;
}
};