5353. 灯泡开关 III
房间中有 n 枚灯泡,编号从 1 到 n,自左向右排成一排。最初,所有的灯都是关着的。
在 k 时刻( k 的取值范围是 0 到 n - 1),我们打开 light[k] 这个灯。
灯的颜色要想 变成蓝色 就必须同时满足下面两个条件:
灯处于打开状态。
排在它之前(左侧)的所有灯也都处于打开状态。
请返回能够让 所有开着的 灯都 变成蓝色 的时刻 数目 。
思路:直接找最大值m和light[i]的关系即可,竞赛的时候居然把过程模拟出来了
大神代码
class Solution {
public:
int numTimesAllBlue(vector<int>& light) {
int m=1,cnt=0;
for(int i=0;i<light.size();i++){
m=max(light[i],m);
if(m==i+1)
cnt++;
}
return cnt;
}
};
VS我的代码(模拟过程)
class Solution {
public:
int numTimesAllBlue(vector<int>& light) {
int len = light.size();
int res=0;
int dp[len+5];
fill(dp, dp+len+1, 0);//初始化全为0,关闭状态
dp[0]=2;//第0栈为蓝色
int next_light;
for(int i=0;i<len;i++){
dp[light[i]]=1;//打开light[i]的灯
if(dp[light[i]-1]==2){//它前一盏灯是蓝色
dp[light[i]]=2;
//把后面连续开着的灯变蓝
next_light=light[i]+1;
while(dp[next_light]==1){
dp[next_light]=2;
next_light++;
}
if(next_light==i+2) res++;
}
}
return res;
}
};
来源:CSDN
作者:vision泉
链接:https://blog.csdn.net/weixin_38603360/article/details/104734686