1004. 最大连续1的个数 III

摘要
Title: 1004. 最大连续1的个数 III
Tag: 二分、双指针
Memory Limit: 64 MB
Time Limit: 1000 ms

Powered by:NEFU AB-IN

Link

1004. 最大连续1的个数 III

  • 题意

    给定一个二进制数组 nums 和一个整数 k ,如果可以翻转最多k 个 0 ,则返回 数组中连续 1 的最大个数 。

  • 思路

    • 二分
      遍历右端点,二分左端点,找到使这个区间0的个数k\le k的最左边的左端点,可以用前缀和进行O(1)O(1)的判断

    • 双指针
      当二分的左端点随着右端点的移动而有序时,应该考虑可以用双指针来优化

  • 代码

    • 二分

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      class Solution:
      def longestOnes(self, nums, k) -> int:
      nums = [-1, *nums]
      b = [0] * len(nums)

      def check(l, r):
      if b[r] - b[l - 1] <= k:
      return True
      return False

      def find(R):
      l, r = 1, len(b) - 1
      while l < r:
      mid = l + r >> 1
      if check(mid, R):
      r = mid
      else:
      l = mid + 1
      return r

      for i in range(len(nums)):
      if nums[i] == 0:
      b[i] = 1
      b[i] += b[i - 1]
      res = 0
      for i in range(1, len(nums)):
      L = find(i)
      if i == L and k == 0 and nums[i] == 0:
      continue
      res = max(res, i - L + 1)
      return res

    • 双指针

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      class Solution:
      def longestOnes(self, nums, k) -> int:
      n = len(nums)
      res, j, cnt = 0, 0, 0 #j左端点, cnt为0的个数
      for i in range(n):
      if nums[i] == 0:
      cnt += 1
      while j <= i and cnt > k:
      if nums[j] == 0:
      cnt -= 1
      j += 1
      res = max(res, i - j + 1)
      return res
使用搜索:谷歌必应百度