力扣红蓝灯算法思路( 前缀一致)

力扣红蓝灯算法思路, 前缀一致

  • 题目描述
  • 思路总结
  • 算法代码

题目描述

给你一个长度为 n 、下标从 1 开始的二进制字符串,所有位最开始都是 0 。我们会按步翻转该二进制字符串的所有位(即,将 0 变为 1)。

给你一个下标从 1 开始的整数数组 flips ,其中 flips[i] 表示对应下标 i 的位将会在第 i 步翻转。

二进制字符串 前缀一致 需满足:在第 i 步之后,在 闭 区间 [1, i] 内的所有位都是 1 ,而其他位都是 0 。

返回二进制字符串在翻转过程中 前缀一致 的次数

输入:flips = [3,2,4,1,5]
输出:2
解释:二进制字符串最开始是 “00000” 。
执行第 1 步:字符串变为 “00100” ,不属于前缀一致的情况。
执行第 2 步:字符串变为 “01100” ,不属于前缀一致的情况。
执行第 3 步:字符串变为 “01110” ,不属于前缀一致的情况。
执行第 4 步:字符串变为 “11110” ,属于前缀一致的情况。
执行第 5 步:字符串变为 “11111” ,属于前缀一致的情况。
在翻转过程中,前缀一致的次数为 2 ,所以返回 2 。

思路总结

  1. 记录下翻牌的最大值,如果还没到最大值的位置,就算 1-i全是1也不对,因为最大值位置是1
  2. 所以当检查的下标i+1 = max的时候,就说明1-i的位置都是1,后续的位置是没有翻开的
  3. 因为flips存储的是1开始,循环是0开始,因此需要i+1

算法代码

var numTimesAllBlue = function(flips) {
    let result = 0;
    let max = 0;
    for(let i = 0; i < flips.length; i++){
        if(flips[i] > max)
            max = flips[i];
        if(i + 1 == max)
            result++;
    }
    return result;
};

PS:这是记录leetcode算法知识心得笔记,欢迎沟通

你可能感兴趣的:(JavaScript,算法类,编程类,算法,leetcode,javascript)