用JavaScript写977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II | 双指针法 | 代码随想录训练营Day2

73 阅读1分钟

977有序数组的平方

本题要点

首先定义三个指针,左右指针分别从左边和右边开始寻找比较更大的数放在右边,放置操作由另一个指针k来实现。

代码实现

JS内置API

可以直接使用数组内置的map操作

var sortedSquares = function(nums) {
  return nums.map( x => x * x).sort((a,b) => (a-b))
};

相向双指针法

var sortedSquares = function(nums) {
  let ret = [], k = nums.length - 1, left = 0, right = nums.length - 1;
  while(left <= right){
    if(nums[left] * nums[left] < nums[right] * nums[right]){
      ret[k--] = nums[right] * nums[right];
      right--;
    } else {
      ret[k--] = nums[left] * nums[left];
      left++;
    }
  }
  return ret;
};

209长度最小的子数组

本题要点

for循环用来表示窗口的终止位置,sum -= nums[i++] 更新sum的值结合前面的while的条件判断,并向后移动i,实现了前指针的向后移动。

代码实现

暴力解法

var minSubArrayLen = function(target, nums) {
  // 暴力解法
   let ret = undefined, sum = 0, subArr = 0;
   for(let i = 0; i < nums.length; i++){
     sum = 0;
     for(let j = i; j < nums.length; j++){
       sum += nums[j];
       if(sum >= target){
         subArr = j - i + 1;
        //  console.log(subArr)
         ret = ret < subArr ? ret : subArr;
         break;
       }
     }
   }
   return ret === undefined ? 0 : ret;
};

双指针(滑动窗口法)

js

var minSubArrayLen = function(target, nums) {
  let ret = undefined, subArr = 0, i = 0, sum = 0
  for(let j = 0; j < nums.length; j++){
    sum += nums[j]
    while(sum >= target){
      subArr = j - i + 1
      ret = ret < subArr ? ret : subArr
      sum -= nums[i++]
    }
  }
  return ret === undefined ? 0 : ret
};

59螺旋矩阵Ⅱ

本题要点

列出二维数组下标来推算i和j到底应该怎么修改,发现定义了很多新的变量,写下来发现除了start可以合并为一个、mid可以直接写成算式之外其他变量都不能缺。附上推算的纸币草图,其实还推了一下n=4和n=16的情况的,不太完整就不放图啦( ̄▽ ̄)"

be2a6144d3b5fd1d2ee85cc00438abd.png

代码实现

var generateMatrix = function(n) {
    let loop = Math.floor(n / 2), start = 0, i = 0, j = 0, count = 1, offset = 1, mid = Math.floor(n / 2);
    const arr = new Array(n).fill(0).map(() => new Array(n).fill(0))
    while(loop--){
        i = start;
        j = start;
        for(j = start; j < n - offset; j++){
            arr[start][j] = count++;
        }
        for(i = start; i < n - offset; i++){
            arr[i][j] = count++;
        }
        for(; j > start; j--){
            arr[i][j] = count++;
        }
        for(; i > start; i--){
            arr[i][j] = count++;
        }
        start++;
        offset++;
    }
    if(n % 2){
        arr[mid][mid] = count
    }
    return arr;
};