zoukankan      html  css  js  c++  java
  • JS leetcode 最大连续1的个数 题解分析

    壹 ❀ 引

    今天来做一道十分烦躁的题目,为什么烦躁,因为我字母写错了提交了三次错了三次!!!我的leetcode正确率大大下降!!那么这道题是leetcode的485. 最大连续1的个数,题目描述如下:

    给定一个二进制数组, 计算其中最大连续1的个数。

    示例 1:

    输入: [1,1,0,1,1,1]
    输出: 3
    

    解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3.
    注意:

    输入的数组只包含 0 和1
    输入数组的长度是正整数,且不超过 10,000。

    我们先简单分析题目,说说我的实现思路,最后再给出优质题解。

    贰 ❀ 解题思路

    首先很重要的一点,数组只包含数字0或1,而且数组的长度是正整数,也就是大于0的整数,所以数组至少有一位,那么我们就得考虑只有0像[0],或者[0,0,0,0,0,0,0]以及只有1的情况[1,1,1,1,1,1]

    我首先想到的就是用正则,我们先将数组转成字符串,然后用正则/1+/g来匹配,+表示至少出现一次,比如:

    '111011'.match(/1+/g);// ["111", "11"]
    

    那我们只需要将匹配的结果按长度排个序,取最后一位就好了:

    ["111", "11"].sort((a,b) => {
        return a.length - b.length;
    });
    

    那我们就直接贴代码:

    /**
     * @param {number[]} nums
     * @return {number}
     */
    var findMaxConsecutiveOnes = function (nums) {
        // 假设数组全部是1,那么直接返回数组length即可
        if (nums.indexOf(0) < 0) {
            return nums.length;
        };
        // 如果数组全部是0,那就直接返回0
        if (nums.indexOf(1) < 0) {
            return 0;
        };
        var nums_ = nums.join("").match(/1+/g).sort(function (a, b) {
            return a.length - b.length;
        });
        return nums_[nums_.length - 1].length;
    };
    

    我的提交错误一次就是没考虑[0]的情况,由于match匹配失败返回null,null.sort直接报错了...阿西吧。

    那么第二种做法其实与正则类似,还是将数组转成字符串,然后按0进行切割,同样排序后取最后一位,这里就直接上代码,思路与上方相同:

    /**
     * @param {number[]} nums
     * @return {number}
     */
    var findMaxConsecutiveOnes = function (nums) {
        if (nums.indexOf(0) < 0) {
            return nums.length;
        };
        if (nums.indexOf(1) < 0) {
            return 0;
        };
        var nums_ = nums.join("").split(0).sort(function (a, b) {
            return a.length - b.length;
        });
        return nums_[nums_.length - 1].length;
    };
    

    虽然达到了效果,很遗憾这两种实现的实现都较慢,像这样:

    由于这道题属于双指针分类,我想着怎么用双指针来解决这个问题,苦思冥想确实没想到好的办法,然后在看了优质解答后,顿时发现与双指针完全没啥关系....思想受限。

    叁 ❀ 更优做法

    直接贴代码:

    /**
     * @param {number[]} nums
     * @return {number}
     */
    var findMaxConsecutiveOnes = function (nums) {
        // 计数器,每次遇到1让其自增
        let count = 0;
        // 当遇到0,就比较count与maxCount,将较大的值赋予maxCount
        let maxCount = 0;
        for (let i = 0; i < nums.length; i++) {
            if (nums[i] === 1) {
                count += 1;
            } else if (nums[i] == 0) {
                maxCount = Math.max(count, maxCount);
                count = 0;
            };
        };
        maxCount = Math.max(count, maxCount);
        return maxCount;
    };
    

    我想大家看了代码思路就很清晰了,以[1,1,1,0,1]为例:

    一开始count为0,遇到第一个1,自增count变成1,又连续遇到2个1,此时count变成了3。

    接下来遇到了0,所以我们得重置count,重置前将count与maxCount较大的数赋予maxCount,所以此时maxCount为3。

    接着遍历,又遇到1,count变成1。由于遍历完成,再次比较count与maxCount,1与3之间3更大,所以最终返回了3。

    思路很简单,但是我确实没想上去,那么关于此题分析就到这里了。

  • 相关阅读:
    cssReset
    CSS的一些小技巧
    前端图标神器
    单例模式
    CSS 控制Html页面高度导致抖动问题的原因
    PHP中include()与require()的区别说明
    extends和implements区别
    静态,抽象类、接口、类库
    jQuery轮播图(手动点击轮播)
    jQuery实现大图轮播
  • 原文地址:https://www.cnblogs.com/echolun/p/12969678.html
Copyright © 2011-2022 走看看