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


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

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

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

    提示 1:

    输入:nums = [1,1,0,1]
    输出:3
    解释:删掉位置 2 的数后,[1,1,1] 包含 3 个 1 。
    示例 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] 。
    示例 3:

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

    输入:nums = [1,1,0,0,1,1,1,0,1]
    输出:4
    示例 5:

    输入:nums = [0,0,0]
    输出:0
     

    提示:

    1 <= nums.length <= 10^5
    nums[i] 要么是 0 要么是 1 。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/longest-subarray-of-1s-after-deleting-one-element
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    做题思路:

    1、首先对原数组nums进行处理,在首尾各添加一个元素0,生成新的数组a,便于下一步计算。

    2、然后对数组a中的元素进行对比。比较里边是否有0元素,并记录0元素的下标在zero数组中。

    3、之后,对zero数组中的元素两两相减,从而得到0元素下表的差值,代表0元素之间存在的1的个数,记录在b数组中。

    4、再之后,对b数组中元素进行两两求和,并进行降序排列,得到其最大值。对其进行输出。

    int compDec(const void *a, const void *b)
    {
        return *(int *)b - *(int *)a;
    }
    int longestSubarray(int* nums, int numsSize){
        int i,k=0,m;
        int zero[numsSize+2];
        int a[numsSize+2];
        a[0]=0;
        a[numsSize+1]=0;
        for(i=0;i<numsSize;i++)
        {
            a[i+1]=nums[i];                              //对num数组首尾加上0元素,重新复制给a获得新的数组
        }
        for(i=0;i<numsSize+2;i++)
        {
            if(a[i]==0)
            {
                zero[k++]=i;                             //记录0元素的下标
            }
        }
        int b[numsSize+2];
        for(i=0;i<k-1;i++)
        {
            b[i]=zero[i+1]-zero[i];                 //计算0元素下标之间的差值,即求存在的1的个数(0元素下标相减,得到的结果比1的长度要大1)
        }
         int c[numsSize+2];
         for(i=0;i<k-2;i++)
         {
             c[i]=b[i+1]+b[i];                        //计算去掉元素0之后1最长的情况
         }
        qsort(c, k-2, sizeof(b[0]), compDec);
        m=c[0]-2;                          
    //对于数组中不存在0元素的数组进行判断
        if(k==2)                               
        {
            m=numsSize-1;
        }
     
     
        return m;
    }
  • 相关阅读:
    26、面向对象设计模式之单例模式——泛型单例
    Unity 汽车碰撞
    makeObjectsPerformSelector对数组中的对象发送消息执行对象中方法
    NSHashTable NSPointerArray
    webrtc 音频一点相关知识
    记一次ios加急上架经历
    iOS 获取当前正在显示的ViewController
    ios表单上传图片或文件
    https适配
    swift block
  • 原文地址:https://www.cnblogs.com/sbb-first-blog/p/13217576.html
Copyright © 2020-2023  润新知