LintCode连续数组

这个题目的名字翻译的不好,题意是:

给一个二进制数组,找到 0 和 1 数量相等的子数组的最大长度
样例
样例 1:
输入: [0,1]
输出: 2
解释: [0, 1] 是具有相等数量的 0 和 1 的最长子数组。
样例 2:
输入: [0,1,0]
输出: 2
解释: [0, 1] (或者 [1, 0]) 是具有相等数量 0 和 1 的最长子数组。
注意事项
给出的二进制数组的长度不会超过 50,000。

一个暴力型的O(n^3)的解法,妥妥的TLE:

const findMaxLength = function (nums) {
    // Write your code here
    var l = nums.length;
    while(l>0){
        for(var j = 0;j<=nums.length-l;j++){
            const filterLength = nums.filter((x,i)=>{
                    return x===1 && i>=j && i < l-j;
            }).length;
            if(l/2=== filterLength){
                return l;
            }
        }
        l--;
    }
    return 0;
}

最后将所有的0视为-1,题目就变成了求和为0的最小数组,同时如果以零点为起点,长度为i,j的子数组的和一样,那么以i为起点,j为末尾结点的子数组的和即为0,利用Map的性质,最后是O(n)复杂度的算法:

const findMaxLength = function (nums) {
    // Write your code here
    var dp = [0];
    for(let i = 1;i<=nums.length;i++){
        dp[i] = dp[i-1] + (nums[i-1]>0?1:-1);
    }
    var map = new Map();
    var max = 0;
    for(let i = 0; i<dp.length;i++){
        if(map.get(dp[i])!==undefined){
            max = Math.max(max,i-map.get(dp[i]));
        }else{
            map.set(dp[i],i);
        }
    }
    return max;
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 4,132评论 0 2
  • 第四天 数组【悟空教程】 第04天 Java基础 第1章数组 1.1数组概念 软件的基本功能是处理数据,而在处理数...
    Java帮帮阅读 1,694评论 0 9
  • 周宗华是被杨贵权拖到杨基禄家的地坝里的,他本来是到杨贵权家里向杨贵权请教数学题,结果杨贵权也有很多不会,显然杨贵权...
    初鸣歇四阅读 449评论 0 1
  • 转载于:http://www.cnblogs.com/qingjoin/p/3227550.html
    ArsonQ阅读 1,043评论 1 1
  • 事情是这样的… 我以为吻痕是口红的印记,然后有人告诉我是淤青,用力吸吮导致血管破裂,我就信了他的邪(感觉自己一会制...
    木木言言阅读 226评论 0 0

友情链接更多精彩内容