LeetCode 5353. 灯泡开关 III

1. 题目

房间中有 n 枚灯泡,编号从 1 到 n,自左向右排成一排。最初,所有的灯都是关着的。

在 k 时刻( k 的取值范围是 0 到 n - 1),我们打开 light[k] 这个灯。

灯的颜色要想 变成蓝色 就必须同时满足下面两个条件:

  • 灯处于打开状态。
  • 排在它之前(左侧)的所有灯也都处于打开状态。

请返回能够让 所有开着的 灯都 变成蓝色 的时刻 数目 。

在这里插入图片描述

输入:light = [2,1,3,5,4]
输出:3
解释:所有开着的灯都变蓝的时刻分别是 124 。

提示:
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;
    }
};

在这里插入图片描述

发布了709 篇原创文章 · 获赞 678 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/qq_21201267/article/details/104740515