LeetCode解法汇总1375. 二进制字符串前缀一致的次数

目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:力扣


描述:

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

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

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

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

示例 1:

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

示例 2:

输入:flips = [4,1,2,3]
输出:1
解释:二进制字符串最开始是 "0000" 。
执行第 1 步:字符串变为 "0001" ,不属于前缀一致的情况。
执行第 2 步:字符串变为 "1001" ,不属于前缀一致的情况。
执行第 3 步:字符串变为 "1101" ,不属于前缀一致的情况。
执行第 4 步:字符串变为 "1111" ,属于前缀一致的情况。
在翻转过程中,前缀一致的次数为 1 ,所以返回 1 。

提示:

  • n == flips.length
  • 1 <= n <= 5 * 104
  • flips 是范围 [1, n] 中所有整数构成的一个排列

解题思路:

* 解题思路:

* 一开始没有看题解,我以为0翻转成1之后,还能翻转回来,所以选择了相对复杂一些的思路,这个思路对于1不能翻转回0一样适用。

* 构建一个有序的set,然后遍历数组,如果set中存在,则删除这个节点,如果不存在,则加入到set中。

* 每次循环的时候,取set中最大的值,和set的长度对比,相同则次数加1,不相同则跳过。

代码:

class Solution1375
{
public:
    int numTimesAllBlue(vector &flips)
    {

        set numSet;
        int abs = 0;
        for (int i = 0; i < flips.size(); i++)
        {
            int value = flips[i];
            if (numSet.find(value) == numSet.end())
            {
                numSet.insert(value);
            }
            else
            {
                numSet.erase(value);
            }
            int maxNum = *(--numSet.end());
            if (maxNum == numSet.size())
            {
                abs++;
            }
        }

        return abs;
    }
};

你可能感兴趣的:(LeetCode编程题解法汇总,leetcode,算法,职场和发展)