1004.最大连续1的个数III
链接:1004.最大连续1的个数III
难度:Medium
标签:数组、二分查找、前缀和、滑动窗口
简介:给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。返回仅包含 1 的最长(连续)子数组的长度。
题解 1 - cpp
- 编辑时间:2022-01-07
- 执行用时:52ms
- 内存消耗:54.2MB
- 编程语言:cpp
- 解法介绍:滑动窗口维护窗口内 0 数。
class Solution {
   public:
    int longestOnes(vector<int>& nums, int k) {
        int ans = 0, l = 0, r = -1, cnt0 = 0;
        while (1) {
            if (cnt0 <= k) {
                r++;
                if (r == nums.size()) break;
                if (nums[r] == 0) cnt0++;
            } else {
                if (nums[l] == 0) cnt0--;
                l++;
            }
            if (cnt0 <= k) ans = max(ans, r - l + 1);
        }
        return ans;
    }
};
题解 2 - typescript
- 编辑时间:2021-02-19
- 执行用时:112ms
- 内存消耗:44.1MB
- 编程语言:typescript
- 解法介绍:双指针。
function longestOnes(A: number[], K: number): number {
  if (A.every(v => !(v & 1))) return K;
  let l = 0;
  let r = 0;
  let sum0 = A[0] & 1 ? 0 : 1;
  let ans = sum0;
  const len = A.length;
  while (r < len) {
    if (sum0 <= K) {
      !(A[++r] & 1) && sum0++;
      ans = Math.max(ans, r - l);
    } else {
      while (sum0 > K) {
        !(A[l++] & 1) && sum0--;
      }
    }
  }
  return ans;
}