贪心算法解决分糖果问题
文章目录
- 贪心算法解决分糖果问题
- [135. 分发糖果](#135. 分发糖果)
- [575. 分糖果](#575. 分糖果)
- [1103. 分糖果 II](#1103. 分糖果 II)
- 总结
135. 分发糖果


代码如下(示例):
c
class Solution {
public:
int candy(vector<int>& ratings)
{
int n = ratings.size();
if (n == 0) return 0;
// 初始化:每个孩子至少1颗糖果
vector<int> candies(n, 1);
// 第一步:左到右遍历,处理「比左边评分高」的情况
for (int i = 1; i < n; i++)
{
if (ratings[i] > ratings[i-1])
{
candies[i] = candies[i-1] + 1;
}
}
// 第二步:右到左遍历,处理「比右边评分高」的情况,取最大值
for (int i = n - 2; i >= 0; i--)
{
if (ratings[i] > ratings[i+1])
{
candies[i] = max(candies[i], candies[i+1] + 1);
}
}
// 计算总糖果数
int total = 0;
for (int num : candies)
{
total += num;
}
return total;
}
};
// 自己写的
class Solution {
public:
int candy(vector<int>& candy)
{
int n = candy.size();
if(n == 0) return 0;
vector<int> candynum(n , 1); //初始时每个人都一个
for(int i = 1 ; i < n ; i++)
{
if(candy[i] > candy[i - 1])
{
candynum[i] = candynum[i - 1] + 1;
}
}
for(int i = n - 2 ; i >= 0 ; i--)
{
if(candy[i] > candy[i + 1])
{
candynum[i] = max(candynum[i] , candynum[i + 1] + 1);
}
}
int total = 0;
for(auto x : candynum)
{
total += x;
}
return total;
}
};
575. 分糖果

代码如下(示例):
c
// 一遍成功
class Solution {
public:
int distributeCandies(vector<int>& candyType)
{
int n = candyType.size() / 2;
unordered_set<int> hash;
for(auto x : candyType)
{
hash.insert(x);
}
int m = hash.size();
return min(m , n);
}
};
class Solution
{
public:
int distributeCandies(vector<int>& candyType)
{
// 步骤1:用哈希集合统计糖果的总种类数
unordered_set<int> candySet(candyType.begin(), candyType.end());
int typeCount = candySet.size();
// 步骤2:妹妹最多能拿的糖果数量
int maxCanGet = candyType.size() / 2;
// 步骤3:返回两者的较小值(核心逻辑)
return min(typeCount, maxCanGet);
}
};
1103. 分糖果 II


代码如下(示例):
c
class Solution
{
public:
vector<int> distributeCandies(int candies, int n)
{
vector<int> res(n, 0); // 初始化每个小朋友的糖果数为0
int i = 0; // 当前分糖果的小朋友下标(0~n-1循环)
int give = 1; // 当前要分的糖果数(从1开始递增)
while (candies > 0)
{
// 本次分给当前小朋友的糖果数:取"应分数量"和"剩余糖果"的较小值
int curr = min(give, candies);
res[i] += curr;
candies -= curr; // 剩余糖果减少
give++; // 下一次应分的糖果数+1
i++;
if(i == n) i = 0;
}
return res;
}
};
// 自己写的
class Solution {
public:
vector<int> distributeCandies(int candies, int num_people)
{
vector<int> res(num_people , 0);
int give = 1;
int i = 0;
while(candies > 0)
{
int cur = min(give , candies);
res[i] += cur;
candies -= cur;
give++;
i++;
if(i == num_people) i = 0;
}
return res;
}
};
总结
这篇文章是作者搜集大量面经和资料这里出来的。感谢你的支持
作者wkm是一名中国矿业大学(北京) 大一的新生,希望得到你的关注
如果可以的话,记得一键三联!