微软专场,较为困难
1. 换酒问题
class Solution {
public:
int numWaterBottles(int numBottles, int numExchange) {
int remains = numBottles;
int ans = remains;
while(remains>=numExchange)
{
//ans += remains;
int n = remains / numExchange;
remains -= n*numExchange;
ans+=n;
remains += n;
}
return ans;
}
};
2. 子树中标签相同的节点数
思路
dp[i][j]表示标号i,子树标签j(j=标号字母-‘a’)的节点数和。
dp[i][j] = sum(children[k][j])
树上dp。注意传参数,直接传labels会超时。传labels的引用就能过。
代码
class Solution {
public:
vector<vector<int>> dp;
vector<vector<int>> children;
vector<bool> vis;
vector<int> ans;
//string labels;
void dfs(int r, string& labels)
{
vis[r] = true;
for(int i : children[r])
{
if(vis[i])
continue;
dfs(i,labels);
for(int j=0;j<26;j++)
{
dp[r][j] += dp[i][j];
}
}
int labelid = labels[r] - 'a';
dp[r][labelid] += 1;
ans[r] = dp[r][labelid];
}
vector<int> countSubTrees(int n, vector<vector<int>>& edges, string labels) {
dp = vector<vector<int>>(n, vector<int>(26));
vis.resize(n);
ans = vector<int>(n);
children = vector<vector<int>>(n+1);
for(auto &edge : edges)
{
children[edge[0]].push_back(edge[1]);
children[edge[1]].push_back(edge[0]);
}
//this->labels = labels;
dfs(0,labels);
return ans;
}
};