返回介绍

solution / 1300-1399 / 1375.Number of Times Binary String Is Prefix-Aligned / README

发布于 2024-06-17 01:03:20 字数 3255 浏览 0 评论 0 收藏 0

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

English Version

题目描述

给你一个长度为 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] 中所有整数构成的一个排列

解法

方法一:直接遍历

我们可以遍历数组 $flips$,记录当前遍历过的元素的最大值 $mx$,若 $mx$ 等于当前遍历到的下标 $i$,则说明前 $i$ 个元素都被翻转过了,即前缀一致,答案累加。

遍历结束后,返回答案即可。

时间复杂度 $O(n)$,其中 $n$ 为数组 $flips$ 的长度。空间复杂度 $O(1)$。

class Solution:
  def numTimesAllBlue(self, flips: List[int]) -> int:
    ans = mx = 0
    for i, x in enumerate(flips, 1):
      mx = max(mx, x)
      ans += mx == i
    return ans
class Solution {
  public int numTimesAllBlue(int[] flips) {
    int ans = 0, mx = 0;
    for (int i = 1; i <= flips.length; ++i) {
      mx = Math.max(mx, flips[i - 1]);
      if (mx == i) {
        ++ans;
      }
    }
    return ans;
  }
}
class Solution {
public:
  int numTimesAllBlue(vector<int>& flips) {
    int ans = 0, mx = 0;
    for (int i = 1; i <= flips.size(); ++i) {
      mx = max(mx, flips[i - 1]);
      ans += mx == i;
    }
    return ans;
  }
};
func numTimesAllBlue(flips []int) (ans int) {
  mx := 0
  for i, x := range flips {
    mx = max(mx, x)
    if mx == i+1 {
      ans++
    }
  }
  return
}
function numTimesAllBlue(flips: number[]): number {
  let ans = 0;
  let mx = 0;
  for (let i = 1; i <= flips.length; ++i) {
    mx = Math.max(mx, flips[i - 1]);
    if (mx === i) {
      ++ans;
    }
  }
  return ans;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文