当前位置: 首页 > news >正文

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

目录

  • 一、题目
  • 二、思路
    • 2.1 解题思路
    • 2.2 代码尝试
    • 2.3 疑难问题
    • 2.4 复盘
  • 三、解法
  • 四、收获
    • 4.1 心得
    • 4.2 举一反三

一、题目

在这里插入图片描述

二、思路

2.1 解题思路

2.2 代码尝试

class Solution {
public:
    int longestSubarray(vector<int>& nums) {
        int len=0;
        int l=0;
        int a=1;
        int ret=1;
        int pos=0;
        //用乘积来作为窗口的满足条件,如果小于1,说明窗口内包含了0
        for(int r=0;r<nums.size();r++){
            
            ret*=nums[r];
            while(ret<1){
                if(a>0){
                    ret=1;
                    a--;
                }else{
                    len=max(len,r-l);
                    l=pos+1;
                }
                pos=r;
            }
            len=max(len,r-l+1);
        }
        return len;
    }
};

2.3 疑难问题

2.4 复盘

乘积溢出问题:使用乘积来判断子数组是否满足条件可能会导致整数溢出问题,尤其是当数组中的元素较大时。可以考虑使用对数或其他方法来避免溢出。
逻辑错误:代码中的 a 变量用于记录是否已经删除了一个0,但逻辑上不够清晰。当 ret < 1 时,代码会尝试删除一个0,但删除0后并没有正确地更新窗口的左边界 l。

三、解法

class Solution {
public:
    int longestSubarray(vector<int>& nums) {
        int ans = 0;
        int p0 = 0, p1 = 0;
        for (int num: nums) {
            if (num == 0) {
                p1 = p0;
                p0 = 0;
            }
            else {
                ++p0;
                ++p1;
            }
            ans = max(ans, p1);
        }
        if (ans == nums.size()) {
            --ans;
        }
        return ans;
    }
};


四、收获

4.1 心得

这个解法真是妙啊,并没有用一个全局变量来标记是否用过0,另外一种思路,就是用指针更新,p1指针有了两次机会,妙。所以说好的代码是从设计、思路上就很优越。

4.2 举一反三

不能局限于模板,要有好的设计思路,当然这也不是一时半会儿能学会的
http://www.dtcms.com/a/54037.html

相关文章:

  • Redis - 核心原理深度解析:线程模型、持久化与高可用性
  • TensorFlow深度学习实战(10)——迁移学习详解
  • Swagger UI界面的使用
  • 系统架构设计师教材:数据库设计基础知识
  • 从零开始的 Kafka 学习(二)| 集群启动
  • 深入解析 Umi-OCR:高效的免费开源 OCR 文字识别工具
  • OpenCV计算摄影学(15)无缝克隆(Seamless Cloning)调整图像颜色的函数colorChange()
  • Spring实战spring-ai运行
  • fastapi+mysql实现问卷调查系统
  • DeepSeek+知识库+鸿蒙,助力鸿蒙高效开发
  • Java集合面试题(持续更新)
  • 动态规划01背包问题系列一>最后一块石头的重量II
  • Spring Boot使用JDBC /JPA访问达梦数据库
  • 安卓免费多功能工具:一站式解决 PDF 阅读、编辑、转换等需求
  • 基础算法总结
  • vue3:七、拦截器实现
  • PX4中的UAVCAN_V1的实现库libcanard与数据格式DSDL
  • 【微知】Mellanox驱动中to是什么?有哪些超时时间?(time out,心跳2s,reset 1分钟)
  • 正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-2.1 uboot简介
  • 算法-图-dijkstra 最短路径
  • Linux线程机制
  • 使用joblib 多线程/多进程
  • 锂电池升压到5V并且可以锂电池充电的芯片SM5401
  • K8S学习之基础十六:k8s中Deployment更新策略
  • AUTOSAR—TM模块介绍及使用概要
  • 深入剖析 Kubernetes 弹性伸缩:HPA 与 Metrics Server
  • 文件解析:doc、docx、pdf
  • 开发环境搭建-06.后端环境搭建-前后端联调-Nginx反向代理和负载均衡概念
  • RAG了解与实践
  • QEMU源码全解析 —— 块设备虚拟化(1)