代码随想录算法训练营第二天|977、209、59

77 阅读2分钟

俩道中等题全军覆没。。

977.有序数组的平方

思路:平方后的数组俩端大,中间小。俩个指针分别指向头尾开始比较,大的进新数组。同时大的一端的指针往中间移动一位,再和另外一端指针的值比较。以此反复。

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var sortedSquares = function(nums) {
    let newNums = []
    let slow = 0
    let fast = nums.length - 1
    let k = nums.length - 1
    while(slow <= fast){
        if(nums[slow] ** 2 <= nums[fast] ** 2){
            newNums[k] = nums[fast]
            k--
            fast--
        }else{
            newNums[k] = nums[slow]
            k--
            slow++
        }
    }
    return newNums
};
 209.长度最小的子数组

完全没思路,看题解的。

思路:通过循环计算出每项相加的值,当值大于或者等于目标值时,将初始位置向右移动一格。就这样不断调节出大于或等于目标值的区间,再经过缩区间看看是否能更小。

/**
* @param {number} target
* @param {number[]} nums
* @return {number}
*/

var minSubArrayLen = function(target, nums) {
 let area = Infinity;
 let sums = 0;
 let i =0;
 for(let j = 0;j<nums.length;j++){
    sums +=nums[j]
   while(sums >= target){
    sums -= nums[i]
    area = Math.min(area,j-i +1)
    i++
    }
 }
 return area == Infinity ? 0 : area
};
59.螺旋矩阵II

这题就更没有思路了。。。看了题解会觉得很妙,嗯,我不想写这么妙的..

/**
 * @param {number} n
 * @return {number[][]}
 */
var generateMatrix = function(n) {
  let doubleArray = new Array(n).fill(0).map(() => new Array(n).fill(0));
  //循环圈数
  let loop = n >> 1
  //中间位置的坐标
  let center = n >> 1
  //开始位置/结束位置
  let startX = 0;
  let startY = 0;
  //值
  let count = 1;
  //偏移量
  let offset = 1;
  while(loop){
      i = startX
      j = startY
      //第一、二、三、四圈循环
      for(;j< n - offset;j++){
          doubleArray[i][j] = count
          count ++
      }
      for(;i < n - offset;i++){
          doubleArray[i][j] = count
          count ++ 
      }
      for(;j>startY;j--){
          doubleArray[i][j] = count
          count ++ 
      }
      for(;i>startX;i--){
          doubleArray[i][j] = count
          count ++ 
      }
      loop -- 
      offset ++
      startX ++ 
      startY ++ 
  }
  if(n % 2 === 1){
      doubleArray[center][center] = count
  }
  return doubleArray
};

关键在于边界的处理,遵循左闭右开的原则,这样一圈才可以用统一的原则写出来。 截屏2023-11-10 10.55.01.png