听说不是很难,本弱鸡就来试一试,感觉还是有所收获的。
1374. 生成每种字符都是奇数个的字符串
这道是思维题:我们那到一个数n,有两种情况:
若他是奇数,那么直接返回n个字符组成的字符串
若他是偶数,那么,我们分成一个1+一个奇数输出就行了。简单的一题目。
class Solution {
public:
string generateTheString(int n) {
string ans;
if(n%2==1){
while(n--) ans+='a';
}
else{
for(int i=1;i<n;i++){
ans+='a';
}
ans+='b';
}
return ans;
}
};
1375. 灯泡开关 III
第二题也是道思维题,但是会稍微难想一点。
从一开始没有点亮的时候,每次点亮(condition数组设为1)之后,判断一下是否和左侧连通,联通了,路上的灯就全部调为蓝色(condition数组设为2),并记下此时最右侧的灯的位值。
之后每次点亮之后,判断刚才记录下的最右侧的值和刚才点亮之后,是否能再形成一段连通,能的话再更新一次最右侧灯的值,以此类推。
计算全部都是蓝灯的次数,就是已经点亮的灯的数目(我的代码里是i+1)和目前最右侧的蓝灯的位值的值(pre)是否相等,相等,则counter++。
class Solution {
public:
int numTimesAllBlue(vector<int>& light)
{
int condition[50005]={0};
condition[0]=1;
int counter=0;
int pre=0;
for(int i=0;i<light.size();i++)
{
int flag=0;
condition[light[i]]=1;
for(int j=pre;j<light[i];j++){
if(condition[j]==0)
{
flag=1;
break;
}
}
if(!flag)
{
condition[light[i]]=2;
pre=light[i];
while(condition[pre]!=0){
condition[pre]=2;
pre++;
}
pre--;
if(i+1==pre){
counter++;
}
}
}
return counter;
}
};
1376. 通知所有员工所需的时间
这就是道简单的树形dp了,遍历到最下面一层,然后返回每一层所需的时间,最后加完返回就是了。但是这道题和我们平时写的树形dp不一样,因为它给的节点,没有连成图。没有怎么办?自己造吧。。上代码
class Solution {
public:
vector<int> tree[100000+5];
int dfs(int father,int now,vector<int>&informTime){
int sn=0;
for(int i=0;i<tree[now].size();i++){
int child=tree[now][i];
if(child==father) continue;
sn=max(dfs(now,child,informTime),sn);
}
sn+=informTime[now];
return sn;
}
int numOfMinutes(int n, int headID, vector<int>& manager, vector<int>& informTime) {
for(int i=0;i<manager.size();i++)
{
if(manager[i]==-1) continue;
tree[manager[i]].push_back(i);
tree[i].push_back(manager[i]);
}
return dfs(-1,headID,informTime);
}
};
1377. T 秒后青蛙的位置
这道和上面那道一样自己建树,之后,我们根据目前的这个节点的子结点个数求出下一层的概率,再dfs下去。还要注意一下,这只青蛙是会原地跳的,所以,我们需要在原地一直dfs,知道步数变为0再返回。另外,还有一个特判:如果只有一个节点1,那么,直接就是1.
ac代码
class Solution {
public:
int num;
double ans;
vector<int> e[105];
bool dfs(int t,int target,int father,int now,double p){
if(t==0&&now==target){
ans=p;
return true;
}
else if(now==target&&((e[now].size()==1&&father!=-1)||(num==1))){
ans=p;
return true;
}
else if(t==0){
return false;
}
else{
int fm;
if(father==-1) fm=e[now].size();
else fm=e[now].size()-1;
for(int i=0;i<e[now].size();i++){
int child=e[now][i];
if(child==father) continue;
if(dfs(t-1,target,now,child,p/(double)fm)) return true;
}
return false;
}
}
double frogPosition(int n, vector<vector<int>>& edges, int t, int target) {
ans=0;
num=n;
for(int i=0;i<edges.size();i++){
int a=edges[i][0];
int b=edges[i][1];
e[a].push_back(b);
e[b].push_back(a);
}
dfs(t,target,-1,1,1);
return ans;
}
};