第一章 数组part02 Day02

52 阅读2分钟

题目

  • 977.有序数组的平方
  • 209.长度最小的子数组
  • 59.螺旋矩阵II
  • 总结
    • 建议大家先独立做题,然后看视频讲解,然后看文章讲解,然后在重新做一遍题,把题目AC,最后整理成今日当天的博客
    • 拓展题目可以先不做

详细布置

977.有序数组的平方

题目建议: 本题关键在于理解双指针思想

题目链接:leetcode.cn/problems/sq… 文章讲解:programmercarl.com/0977.%E6%9C… 视频讲解: www.bilibili.com/video/BV1QB…

var sortedSquares = function (nums) {
  let res = [];
  let left = 0,
    right = nums.length - 1;

  while (left <= right) {
    const leftNum = Math.abs(nums[left]);
    const rightNum = Math.abs(nums[right]);

    if(rightNum>leftNum) {
      res.unshift(rightNum*rightNum);
      right --;
    } else {
      res.unshift(leftNum*leftNum);
      left ++ ;
    }
  }

  return res
};

const nums = [-7, -3, 2, 3, 11];
console.log(sortedSquares(nums));

209.长度最小的子数组

题目建议: 本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。 拓展题目可以先不做。

题目链接:leetcode.cn/problems/mi… 文章讲解:programmercarl.com/0209.%E9%95… 视频讲解:www.bilibili.com/video/BV1tZ…

var minSubArrayLen = function (target, nums) {
  let result = Number.MAX_SAFE_INTEGER; // 或者定义比nums的长度大1都可以
  let subLen = 0;
  let sum = 0;
  let i = 0;

  for (let j = 0; j < nums.length; j++) {
    sum += nums[j];

    while (sum >= target) {
      subLen = j - i + 1;
      result = subLen < result ? subLen : result;

      sum -= nums[i];
      i++;
    }
  }

  return result === Number.MAX_SAFE_INTEGER ? 0 : result;
};

59.螺旋矩阵II

题目建议: 本题关键还是在转圈的逻辑,在二分搜索中提到的区间定义,在这里又用上了。

题目链接:leetcode.cn/problems/sp… 文章讲解:programmercarl.com/0059.%E8%9E… 视频讲解:www.bilibili.com/video/BV1SL…

总结

/**
 * @param {number} n
 * @return {number[][]}
 */
var generateMatrix = function(n) {
  let startY = (startX = 0);
  let loop = Math.floor(n / 2);
  let mid = Math.floor(n / 2);
  let offset = 1;
  let count = 1;
  let res = new Array(n).fill(0).map((el) => new Array(n).fill(0));

  while (loop--) {
    let row = startX, col = startY;

    // (左闭右开)
    // 上行从左到右
    while (col < n - offset) {
      res[row][col] = count++;
      col++;
    }

    // 右列从上到下
    while (row < n - offset) {
      res[row][col] = count++;
      row++;
    }

    // 下行从右到左
    while (col > startY) {
      res[row][col] = count++;
      col--;
    }

    // 左列从下到上
    while (row > startX) {
      res[row][col] = count++;
      row--;
    }

    startX++;
    startY++;

    offset += 1;
  }

  if (n % 2 === 1) {
    res[mid][mid] = count;
  }
  return res;
};