码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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
  • 相关阅读:
    python机器人编程——差速机器人小车的控制,控制模型、轨迹跟踪,轨迹规划、自动泊车(上)
    day062:平衡二叉树——左旋、右旋
    【Python爬虫】解析xpath——尚硅谷
    文本文件的读取+操作
    开源云真机平台-Sonic应用实践
    计算机提示vcomp120.dll丢失怎样修复,vcomp120.dll丢失的4个修复方法分享
    Mybatis与Spring的集成
    声明式事务管理案例-转账(xml、注解)
    【优化求解】基于遗传算法优化PARSEC 方法的翼型形状附matlab代码
    Rust动态数组Vec
  • 原文地址:https://blog.csdn.net/weixin_36313227/article/details/125604723
  • 最新文章
  • 【FHE】我们如何实现同态加密推理(八):SiLU 的密文化——两条路径,和一个 8 字节的开关
    SQLcl 中 c/old/new 替换变量为何失效?先定位再替换
    不让模型写作文,直接从它脑子里读答案:Jev 决策在 .NET 的两条路线
    Halo插件:支持GitHub的图床附件策略
    电视投屏界的“一股清流”!SimpleTVCast 6.0.0-beta 抢先体验:无需TV端App,界面大换血!✨
    华三VXLAN集中式网关实战指南:Spine多活网关 + 双活接入(M-LAG)
    软件更好写之后口碑会更重要
    大 O、大 Omega、大 Theta 的区别,O(n) 复杂度是什么意思
    Java标签跳转:一个鲜为人知但却很实用的小技巧
    多智能体系统论文速读
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号