当前位置: 首页 > 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 举一反三

不能局限于模板,要有好的设计思路,当然这也不是一时半会儿能学会的

相关文章:

  • 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 最短路径
  • 搜狐一季度营收1.36亿美元,净亏损同比收窄超两成
  • 盲人不能刷脸认证、营业厅拒人工核验,央媒:别让刷脸困住尊严
  • 中国旅游日|上天当个“显眼包”!体验低空经济的“飞”凡魅力
  • 杨建全已任天津市委副秘书长、市委市政府信访办主任
  • 海外考古大家访谈|冈村秀典:礼制的形成与早期中国
  • 工人日报:应对“职场肥胖”,健康与减重同受关注