X

LEETCODE 1375. Bulb Switcher III 解题思路分析

题目大意:

灯泡开关 III

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

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

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

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

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

示例 1:

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

示例 2:

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

示例 3:

输入:light = [4,1,2,3]
输出:1
解释:所有开着的灯都变蓝的时刻是 3(index-0)。
第 4 个灯在时刻 3 变蓝。

示例 4:

输入:light = [2,1,4,3,6,5]
输出:3

示例 5:

输入:light = [1,2,3,4,5,6]
输出:6

提示:

  • n == light.length
  • 1 <= n <= 5 * 10^4
  • light[1, 2, ..., n] 的一个排列。

如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=1375

解题思路分析:

本题需要找到全部蓝灯点亮的规律即可轻松解题。试想,如果当前所有开着的灯都是蓝色,那么必须满足,从第一盏灯到第x盏灯都是点亮状态,也就是说,所有亮着灯的位置都是连续的,并且连续区间的起点是1。这样一来,我们能得出一个结论,即当打开的灯的最大编号等于打开灯数量的时刻,一定满足上述条件,即此时灯全是蓝色,返回结果加一。

实现代码:

public int numTimesAllBlue(int[] light) {
    int res=0; // 返回结果
    int max=0; // 所有打开灯的最大编号
    for(int i=0;i<light.length;i++){
        // 更新最大编号
        max=Math.max(max,light[i]);
        // 如果最大编号等于打开灯的数量
        // 返回结果加一
        if(max==i+1) res++;
    }
    return res;
}

本题解法执行时间为2ms。

Runtime: 2 ms, faster than 90.37% of Java online submissions for Bulb Switcher III.Memory Usage: 50.6 MB, less than 100.00% of Java online submissions for Bulb Switcher III.

本网站文章均为原创内容,并可随意转载,但请标明本文链接
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: http://leetcode.jp/leetcode-1375-bulb-switcher-iii-解题思路分析/
Categories: leetcode
kwantong: