leetcode 135. 分发糖果
n
个孩子站成一排。给你一个整数数组 ratings
表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
- 每个孩子至少分配到
1
个糖果。 - 相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。
示例 1:
输入:ratings = [1,0,2] 输出:5 解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。示例 2:
输入:ratings = [1,2,2] 输出:4 解释:你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。 第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。
代码
// leetcode 135. 分发糖果
class Solution {
public:
int candy(vector<int>& ratings) {
vector<int> candies(ratings.size(), 1);
int size = ratings.size();
//从左往右遍历
for (int i = 1; i < size; ++i)
{
if (ratings[i] > ratings[i - 1])
{
candies[i] = candies[i - 1] + 1;
}
}
//从右往左遍历
int result = candies[size - 1];
for (int i = size - 2; i >= 0; --i)
{
if (ratings[i] > ratings[i + 1] && candies[i] <= candies[i + 1])
{
candies[i] = candies[i + 1] + 1;
}
result += candies[i];
}
return result;
}
};
leetcode 860. 柠檬水找零
在柠檬水摊上,每一杯柠檬水的售价为 5
美元。顾客排队购买你的产品,(按账单 bills
支付的顺序)一次购买一杯。
每位顾客只买一杯柠檬水,然后向你付 5
美元、10
美元或 20
美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5
美元。
注意,一开始你手头没有任何零钱。
给你一个整数数组 bills
,其中 bills[i]
是第 i
位顾客付的账。如果你能给每位顾客正确找零,返回 true
,否则返回 false
。
示例 1:
输入:bills = [5,5,5,10,20] 输出:true 解释: 前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。 第 4 位顾客那里,我们收取一张 10 美元的钞票,并返还 5 美元。 第 5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。 由于所有客户都得到了正确的找零,所以我们输出 true。示例 2:
输入:bills = [5,5,10,10,20] 输出:false 解释: 前 2 位顾客那里,我们按顺序收取 2 张 5 美元的钞票。 对于接下来的 2 位顾客,我们收取一张 10 美元的钞票,然后返还 5 美元。 对于最后一位顾客,我们无法退回 15 美元,因为我们现在只有两张 10 美元的钞票。 由于不是每位顾客都得到了正确的找零,所以答案是 false。
代码
// leetcode 860. 柠檬水找零
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
vector<int> lingqian(2, 0); // 0 -- 5 1--10
for (int i = 0; i < bills.size(); ++i)
{
if (bills[i] == 5)
{
lingqian[0]++;
}
else if (bills[i] == 10)
{
if (lingqian[0] >= 1)
{
lingqian[0]--;
lingqian[1]++;
}
else
{
return false;
}
}
else if (bills[i] == 20)
{
int count = 15;
if (lingqian[1] >= 1)
{
lingqian[1]--;
count -= 10;
}
while (lingqian[0] && count)
{
count -= 5;
lingqian[0]--;
}
if (count != 0)
{
return false;
}
}
}
return true;
}
};