代码随想录算法训练营第二天| 209. 长度最小的子数组、59.螺旋矩阵II

44 阅读2分钟

209. 长度最小的子数组

相关链接: 题目链接 文章讲解 视频讲解

解题思路

重点:双指针的滑动窗口

  • i:指针指向开始点
  • j:指向数组的结束点
  • sum: 数组元素的和
  • res:存储数组的长度:开始长度值要大于数组的值,如果最后值不变,则没有找到

*注意:需要不断的判断数组的和是否大于等于target,即尽可能多的移动i的位置,尽可能缩小窗口的大小

代码

var minSubArrayLen = function(target, nums) {
    var sum = 0,res = nums.length + 1, i = 0;
    for(var j =0; j<nums.length; j++){
        sum += nums[j];
        while(sum >= target){
            res = Math.min(res, j - i + 1);
            // 向右移动,左指针,比如 1,1,1,1,100  target=100
            sum = sum - nums[i];
            i++;
        }
    }
    // 1,1,1,1,1,1  target = 10  这样子res 一直不变,所以设置长度大于数组的长度,这样就是找不到
    if(res == nums.length + 1){
        return 0;
    }
    return res;
};

59.螺旋矩阵II

相关链接:  题目链接 文章讲解 视频讲解

解题思路

模拟顺时针画矩阵的过程:

  • 填充上行从左到右
  • 填充右列从上到下
  • 填充下行从右到左
  • 填充左列从下到上

由外向内一圈一圈这么画下去。这里一圈下来,我们要画每四条边,每画一条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来。 左闭右开的原则,来画一圈 image.png

注意: 一共画几圈,就是 n>> 1 次数,如果是n是奇数,则只需要填充最中间的元素,即可。

  • startX 每一轮的开始 x位置
  • startY 每一轮的开始y 位置
  • offset 每一轮每条边不需要填的个数 代码
var generateMatrix = function(n) {
    var rc = n >> 1, startX = 0, startY =0, offset = 1, count = 1,
        arr = new Array(n).fill(0).map(() => new Array(n).fill(0));
    while(rc){
        for(let j = startY; j< n - offset;j++){
            arr[startX][j] =  count++;
        }
        for(let i = startX; i< n - offset; i++){
            arr[i][n-offset] = count++;
        }
        for(let j = n - offset;j>startY;j--){
            arr[n-offset][j] = count++;
        }
        for(let i = n - offset;i>startX;i--){
            arr[i][startY]=count++;
        }
        startX++;
        startY++;
        offset++;
        rc--;

    }
    if(n % 2 ===1){
        arr[startX][startY] = count;
    }
    return arr;
};