• LeetCode1493. 删掉一个元素以后全为 1 的最长子数组


    给你一个二进制数组 nums ,你需要从中删掉一个元素。

    请你在删掉元素的结果数组中,返回最长的且只包含 1 的非空子数组的长度。

    如果不存在这样的子数组,请返回 0 。

    提示 1

    输入:nums = [1,1,0,1]
    输出:3
    解释:删掉位置 2 的数后,[1,1,1] 包含 3 个 1 。
    
    • 1
    • 2
    • 3

    示例 2

    输入:nums = [0,1,1,1,0,1,1,0,1]
    输出:5
    解释:删掉位置 4 的数字后,[0,1,1,1,1,1,0,1] 的最长全 1 子数组为 [1,1,1,1,1] 。
    
    • 1
    • 2
    • 3

    示例 3

    输入:nums = [1,1,1]
    输出:2
    解释:你必须要删除一个元素。
    
    • 1
    • 2
    • 3

    提示

    1 <= nums.length <= 105
    nums[i] 要么是 0 要么是 1 。
    
    • 1
    • 2

    题解

    • 滑动窗口(双指针):
      • 当当前数字为1,连续1的长度+1
      • 当当前数字为0
        • 之前没有删除0,将当前0删除。继续
        • 之前已经删除了一个0,更新最长连续1的长度;并缩小窗口左侧到前面删除的0的下标的下一个位置
        • 标记该0下一个位置的下标
    • left/right标记窗口的左右两侧下标
    • hasDeleteNum标记是否已经删除0
    • len标记连续1的长度,maxLen标记最长连续1的长度
    • nextLeft标记每个0的下个位置的下标,即缩小窗口时left将要移动到的位置
    #include "bits/stdc++.h"
    using namespace std;
    
    class Solution {
    public:
        int longestSubarray(vector<int>& nums) {
            int left = 0;
            int right = 0;
            bool hasDeleteNum = false;
            int len = 0;       // 连续1的长度
            int maxLen = 0;    // 最长连续1的长度
            int nextLeft = -1; // 记录每个0的下一个下标,标记缩小窗口时left的位置
            while (right < nums.size()) {
                if (nums[right] == 1) {
                    ++len;
                } else if (hasDeleteNum) {
                    maxLen = max(maxLen, len);
                    left = nextLeft;
                    len = right - left;
                    nextLeft = right + 1;
                } else {
                    hasDeleteNum = true;
                    nextLeft = right + 1;
                }
                ++right;
            }
            maxLen = max(maxLen, len);
            return nextLeft == -1 ? maxLen - 1 : maxLen; // 不包含0,需要删去一个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
  • 相关阅读:
    05 vue 计算属性的练习 1 methods \computed\ watch三种方法对比实例
    spring security快速入门 (无多余额外功能)
    【春秋云境】CVE-2022-24124复现
    遗传算法(GA)优化的BP神经网络预测,GA-BP回归预测,多输入单输出模型。
    基于SpringBoot、Vue的电影院管理系统
    TensorRT-Plugin编写
    修炼k8s+flink+hdfs+dlink(一:安装hdfs)
    攻防世界misc
    如何在数据库中存储小数:FLOAT、DECIMAL还是BIGINT?
    02-Linux
  • 原文地址:https://blog.csdn.net/weixin_36313227/article/details/125604723