1. 题目
房间中有 n 枚灯泡,编号从 1 到 n,自左向右排成一排。最初,所有的灯都是关着的。
在 k 时刻( k 的取值范围是 0 到 n - 1),我们打开 light[k] 这个灯。
灯的颜色要想 变成蓝色 就必须同时满足下面两个条件:
- 灯处于打开状态。
- 排在它之前(左侧)的所有灯也都处于打开状态。
请返回能够让 所有开着的 灯都 变成蓝色 的时刻 数目 。
输入:light = [2,1,3,5,4]
输出:3
解释:所有开着的灯都变蓝的时刻分别是 1,2 和 4 。
提示:
n == light.length
1 <= n <= 5 * 10^4
light 是 [1, 2, ..., n] 的一个排列。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bulb-switcher-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 按照题意模拟即可
class Solution {
public:
int numTimesAllBlue(vector<int>& light) {
int n = light.size(), i, j, count = 0, rightLight = 0;
vector<bool> leftallok(n,false);//左侧等都是亮的吗
vector<bool> Lig(n,false);//该位置灯亮了吗
for(i = 0; i < n; ++i)
{
Lig[light[i]-1] = true;//灯亮起来
rightLight = max(rightLight, light[i]-1);//最右侧的灯
if(light[i]-1 == 0)
leftallok[0] = true;//第一个灯的话,左边全亮
else
{
if(leftallok[light[i]-1-1])//左边灯全亮,那么到我这也全亮
leftallok[light[i]-1] = true;
}
if(leftallok[light[i]-1])//如果我这全亮的,向右检查挨着的是否亮
for(j = light[i]; j <= rightLight; ++j)
{
if(Lig[j])//右边有亮的
leftallok[j] = true;//到那里也是全亮
else
break;
}
if(leftallok[rightLight])//最右侧的灯的左边全亮,计数+1
count++;
}
return count;
}
};