美文网首页算法
1375. 二进制字符串前缀一致的次数

1375. 二进制字符串前缀一致的次数

作者: 红树_ | 来源:发表于2023-06-13 09:37 被阅读0次

LC每日一题,参考1375. 二进制字符串前缀一致的次数,难度分1439。

题目

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

解题思路

  • 枚举:根据题意,可知前缀一致条件,枚举判断。
  • 树状数组:根据树状数组前缀和判断(普通数组求前缀和n^2超时)。

枚举

class Solution {
    public int numTimesAllBlue(int[] flips) {
        //要想前缀一致 需要保证当前flips的值连续如[3214][123][312]等最大值=长度
        int ans = 0,n = flips.length,max = 0;
        for(int i = 0; i < flips.length; i++){
            max = Math.max(max,flips[i]);
            if(max == i+1) ans ++;
            /*else if(max == n) {//此时除了i=n-1之后都不满足退出循环
                ans++;
                break;
            }*/
        }
        return ans;
    }
}

复杂度分析

  • 时间复杂度:O(n),遍历一次。
  • 空间复杂度:O(1)

树状数组

class Solution {
    int[] tree;
    public int numTimesAllBlue(int[] flips) {
        int n = flips.length;
        tree = new int[n + 1]; // 树状数组 默认为0 表示熄灭
        int res = 0, max = 0; 
        for (int i : flips) {
            set(i);
            max = Math.max(max, i);
            if (sum(max) == max) res++;//根据前缀和判断
        }
        return res;
    }
    //标记为1 表示点亮
    void set(int index) {
        while (index < tree.length) {
            tree[index] += 1;
            index += lowBit(index);
        }
    }
    //前缀和
    int sum(int index) {
        int sum = 0;
        while (index > 0) {
            sum += tree[index];
            index -= lowBit(index);
        }
        return sum;
    }

    int lowBit(int x) {
        return x & (-x);
    }
}

复杂度分析

  • 时间复杂度:O(nlogn),遍历一次n,树状数组logn
  • 空间复杂度:O(n)

相关文章

  • 1375. 二进制字符串前缀一致的次数

    插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。[http...

  • [kuangbin带你飞]KMP & 扩展KMP &am

    【题目 kuangbin KMP J】 题目大意 计算所有前缀在字符串中出现的次数 思路 开始想直接枚举所有前缀,...

  • es6小知识

    1.二进制和十进制的表示法 0b 0B前缀为二进制 0O 0o前缀八进制如果要将0b和0o前缀的字符串数值转...

  • Python内置函数bin()

    bin(x) 返回前缀为“0b”的二进制字符串. 说明 如果参数 x 是整数,函数返回 x 对应的前缀为“0b”的...

  • Python2.7.X字符串比较注意点

    字符串前缀说明 u前缀Unicode编码 b 前缀Ascll编码 无前缀默认编码 出现问题现象 两个字符串列表取交...

  • mysql之字符串字段添加索引

    字符串创建索引方式:1、直接创建完整索引,比较占用空间。2、创建前缀索引,节省空间,但会增加查询扫描次数,并且不能...

  • 字符串-KMP算法

    字符串-KMP算法 若干个字符组成字符串 字符串前缀prefix, 真前缀proper prefix, 后缀suf...

  • 14.最长共同前缀

    返回字符串向量最长共同前缀,如果无共同前缀则返回空字符串。 思路:两两对比得出最长公共前缀,再用得到的前缀和后面的...

  • Longest Common Prefix

    字符串数组的公共前缀

  • Codeforces 1363B - Subsequence H

    日常一道算法题。 翻译 有一个二进制字符串 s,字符串内只有两种字符 "0" 和 "1" 你可以执行任意次数的以下...

网友评论

    本文标题:1375. 二进制字符串前缀一致的次数

    本文链接:https://www.haomeiwen.com/subject/yilcydtx.html