给定一个含有 个正整数的数组和一个正整数 s ,找出该数组中满足其和≥ s的长度最小的连续子数组如果不存在符合条件的连续子数组,返回 0。
image.png

原题目:https://leetcode-cn.com/explo...

正确方法一:
//双指针查找法 O(nlogn)(对数阶)
var minSubArrayLen = function(s, nums) {

    var arr = [];//装载临时数组
    var minLen = 0; //最小的长度 初始为0
    var arrSum = 0; //累加
    var left = 0;
    var right = 1;
    
    while(left<nums.length-1 && right <= nums.length){
        arr = nums.slice(left,right);
        arrSum = arr.length? arr.reduce(function(sum,item){ return sum+item }) :0;
        if(arrSum >= s){
           if(left == 0 || (right - left < minLen)){ 
                minLen = arr.length; // 首次记录符合条件的  或者是此后对比下来比已记载的长度小 则重新赋值minLen
           } 
           ++left; //当前已经符合条件了 左侧滑动  
        }else{
            ++right; //不符合条件,右侧滑动加个数 
       }
    }
    return minLen;
};

以下还有两个错误方法的记载 记录下

错误方法一:
没读好题,以为是找到两者之和大于target最短的长度; \*\*看漏了连续这个字眼\*\*!!!
var minSubArrayLen = function(s, nums) {
    nums.sort(function(a,b){return b-a});
    var arr = [];
    console.log(nums);
    for(var i = 0;i<nums.length;i++){
        arr = nums.slice(0,i+1);
        var arrSum = arr.reduce(function(sum,item){ return sum+item });
        if( arrSum >= s){
            return arr.length;
        }
    }
    return 0;
};

minSubArrayLen(213,\[12,28,83,4,25,26,25,2,25,25,25,12]);
//没看好 题目 还一直在蒙圈 明明我输出是7; 但是答案一直是8 迷糊中;
半正确方法二:
// 可以运行 但是 时间复杂度为 T(n) = O(n2) ; 性能低 数据过大时不行

var minSubArrayLen = function(s, nums) {
    var arr = \[\];//装载临时数组
    var minLen = 0; //最小的长度
    var arrSum = 0; //累加
    for(let i = 0; i<nums.length; i++){
        let j = i+1;
        while ( j <= nums.length)  {
            arr = nums.slice(i,j);
            arrSum = arr.reduce(function(sum,item){ return sum+item });
            if( arrSum >= s && (!minLen || (minLen > arr.length) )){
                minLen = arr.length;
            }
            ++j;
        }
    }
    return minLen;
};

//力扣的验证是丧心病狂的 一大堆数据跑到我浏览器都卡住了?
//最后就是基于这版的改

资料:(这个文章说真的简明易懂清晰 )
十分钟弄懂:数据结构与算法之美 - 时间和空间复杂度

mark一下 仅供参考 欢迎更正补充 end


Jerry
481 声望203 粉丝

学习的付出 从不欺人。记忆总是苦,写总结最牢固