最长连续1子数组解法详解(力扣1004)

问题解析

题目要求:给定一个二进制数组 nums 和一个整数 k,你可以将最多 k 0 翻转为 1。请返回在执行任意次数的翻转操作后,数组中最长的连续 1子数组的长度 。

核心思路 :将问题转化为寻找一个最长的子数组,使得该子数组内 0 的个数不超过 k 。这可以通过滑动窗口(同向双指针) 算法高效解决。

算法流程

1.初始化左指针 left = 0,窗口内 0 的计数器 zeroCount = 0,以及结果 maxLen = 0

  1. 右指针 right 0 开始遍历数组:

* 进窗口 :如果 nums[right] == 0,则 zeroCount++

* 判断与收缩 :当 zeroCount > k 时,说明当前窗口内 0 的数量超过了可翻转的上限。此时需要收缩左边界,即 left 右移。如果移出窗口的元素是 0,则 zeroCount--

* 更新结果 :在每次右指针移动并完成可能的窗口收缩后,当前窗口 [left, right] 一定满足条件( 0 的数量 ≤ k)。此时更新最大长度 maxLen = max(maxLen, right - left + 1)

复杂度分析

  • 时间复杂度:O(n),每个元素最多被访问两次(右指针一次,左指针一次)。
  • 空间复杂度:O(1),仅使用了常数个额外变量。

C++ 代码实现

cpp 复制代码
class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int left = 0;        // 窗口左边界 int zeroCount = 0;   // 窗口内0的个数
        int maxLen = 0;      // 记录最大长度

        // 右指针遍历整个数组
        for (int right = 0; right < nums.size(); ++right) {
            // 1. 右指针元素进窗口
            if (nums[right] == 0) {
                zeroCount++;
            }

            // 2. 判断:如果窗口内0的数量超过k,需要收缩左边界
            while (zeroCount > k) {
                if (nums[left] == 0) {
                    zeroCount--;
                }
                left++; // 左指针右移,窗口收缩
            }

            // 3. 更新最大长度 (此时窗口[left, right]一定满足条件)
            maxLen = max(maxLen, right - left + 1);
        }

        return maxLen;
    }
};

参考来源

相关推荐
葡萄城技术团队9 分钟前
工业数据可视化:使用活字格 AIcoding + Three.js 构建轻量化三维设备监控大屏
开发语言·javascript·信息可视化
qiaosaifei13 分钟前
JAVA老项目中有大量的类名_编译时报找不到符号错误
java·开发语言
聪明蛋子哟17 分钟前
MCP协议深度落地:如何用Python/Java双语言实现统一的工具调用网关?
java·开发语言·python
PFFstronger22 分钟前
测试工程师的职业价值
职场和发展
一晌小贪欢37 分钟前
python-第27天:Python面向对象详解
开发语言·python·数据可视化·面向对象·python办公
青 春 记 忆40 分钟前
LeetCode 350. 两个数组的交集 II|Python 解法详解
python·算法·leetcode
raindayinrain1 小时前
c++并发
c++
j7~1 小时前
【C++】智能指针的使用及其原理--详解
c++·c++11·内存泄漏·智能指针·raii·boost智能指针
迪康Defender1 小时前
公用电脑责任追溯难?迪康端点安全一体化管理系统用户模式详解
java·运维·开发语言·网络·其他·安全
阳明山水1 小时前
销量预测2025—2026:从模型竞赛到系统融合的范式转型
人工智能·深度学习·算法·机器学习·架构