2022-02-25每日刷题打卡
力扣——每日一题
781. 森林中的兔子
森林中有未知数量的兔子。提问其中若干只兔子 “还有多少只兔子与你(指被提问的兔子)颜色相同?” ,将答案收集到一个整数数组 answers 中,其中 answers[i] 是第 i 只兔子的回答。
给你数组 answers ,返回森林中兔子的最少数量。
示例 1:
输入:answers = [1,1,2]
输出:5
解释:
两只回答了 “1” 的兔子可能有相同的颜色,设为红色。
之后回答了 “2” 的兔子不会是红色,否则他们的回答会相互矛盾。
设回答了 “2” 的兔子为蓝色。
此外,森林中还应有另外 2 只蓝色兔子的回答没有包含在数组中。
因此森林中兔子的最少数量是 5 只:3 只回答的和 2 只没有回答的。
简单的说,想要兔子数量最少,我们就尽可能的把相同回答的兔子当成是同一个颜色(回答不同肯定不是同一个颜色),这样这些被聚集在一起的回答一样的兔子,数量就等于它们回答的数+它们自身。但有点要注意的是,聚集在一起的回答相同的兔子不能超过它们回答的数,比如一个兔子说还有三个和它颜色相同的,然后你找来四个回答相同的兔子那显然是不对的,我们计算回答相同的兔子时,如果计数到和回答数一样了就停止计算,把剩下的回答相同的兔子当作是另一种颜色。
class Solution {
public:
int numRabbits(vector<int>& answers) {
sort(answers.begin(),answers.end());
int res=0,n=answers.size();
for(int i=0;i<n;i++)
{
int m=0,ans=answers[i];
while(i<n&&ans==answers[i]&&m<=ans)
{
i++;
m++;
}
res+=ans+1;
i--;
}
return res;
}
};
256. 粉刷房子
假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。
当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个 n x 3 的正整数矩阵 costs 来表示的。
例如,costs[0][0] 表示第 0 号房子粉刷成红色的成本花费;costs[1][2] 表示第 1 号房子粉刷成绿色的花费,以此类推。
请计算出粉刷完所有房子最少的花费成本。
示例 1:
输入: costs = [[17,2,17],[16,16,5],[14,3,19]]
输出: 10
解释: 将 0 号房子粉刷成蓝色,1 号房子粉刷成绿色,2 号房子粉刷成蓝色。
最少花费: 2 + 5 + 3 = 10。
class Solution {
public:
int minCost(vector<vector<int>>& costs) {
int n=costs.size();
int a=costs[0][0],b=costs[0][1],c=costs[0][2];
int a1=0,b1=0,c1=0;
for(int i=0;i<n;i++)
{
a=min(b1,c1)+costs[i][0];
b=min(a1,c1)+costs[i][1];
c=min(a1,b1)+costs[i][2];
a1=a;
b1=b;
c1=c;
}
return min(a1,min(b1,c1));
}
};