北京光辉网站建设,网站推荐入口,免费提供空间的网站,网站版块建设1. 题目
房间中有 n 枚灯泡#xff0c;编号从 1 到 n#xff0c;自左向右排成一排。最初#xff0c;所有的灯都是关着的。
在 k 时刻#xff08; k 的取值范围是 0 到 n - 1#xff09;#xff0c;我们打开 light[k] 这个灯。
灯的颜色要想 变成蓝色 就必须同时满足下…1. 题目
房间中有 n 枚灯泡编号从 1 到 n自左向右排成一排。最初所有的灯都是关着的。
在 k 时刻 k 的取值范围是 0 到 n - 1我们打开 light[k] 这个灯。
灯的颜色要想 变成蓝色 就必须同时满足下面两个条件
灯处于打开状态。排在它之前左侧的所有灯也都处于打开状态。
请返回能够让 所有开着的 灯都 变成蓝色 的时刻 数目 。 输入light [2,1,3,5,4]
输出3
解释所有开着的灯都变蓝的时刻分别是 12 和 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(vectorint light) {int n light.size(), i, j, count 0, rightLight 0;vectorbool leftallok(n,false);//左侧等都是亮的吗vectorbool 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;//到那里也是全亮elsebreak;}if(leftallok[rightLight])//最右侧的灯的左边全亮计数1count;}return count;}
};