训练营Day2-数组

116 阅读2分钟

977. 有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100] 排序后,数组变为 [0,1,9,16,100]

思路

  1. 暴力解法:直接平方之后再排序
  2. 双指针:给的是递增的顺序,因此数组两边的绝对值肯定是更大的,中间的绝对值是更小的,平方之后的最大值一定出现在两端,所以用两个指针比较绝对值大小,然后把平方之后的数组装进数组里,注意因为是递增,所以要从后往前给新数组赋值。
var sortedSquares = function(nums) {
 let left = 0 
 let right = nums.length - 1
 let len = nums.length - 1
 let res = new Array(len)
 while(left <= right) {
 //这里直接比较乘积也可以
     let m = Math.abs(nums[left])
     let n = Math.abs(nums[right])
     if (m >= n) {
       res[len] = m * m
       left++
     }
     else {
       res[len] = n * n
       right--
     }
     len--
 }
 return res
};

、、、

209. 长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

输入: target = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的子数组。

思路

  1. 双指针:首先需要满足和大于target,先移动右指针到满足条件,再移动左指针缩小范围,并且取最小的长度。
  var minSubArrayLen = function(target, nums) {
   let sum = 0
   let min = Infinity
   let right = 0
   for (let i in nums) {
     sum += nums[i]
     while (sum >= target) {
        min = Math.min(min,  i - right + 1)
        sum -=  nums[right]
        right++
     }
   }
   

螺旋矩阵 II

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

输入: n = 3
输出: [[1,2,3],[8,9,4],[7,6,5]]

思路

  1. 建立一个 n * n 的二维数组,按照螺旋顺序赋值
  2. 一个计数器 记录 i 的值
  3. 遍历的顺序 分别是
    • 行是上到下 列是左到右
    • 列是右到左 行是上到下
    • 行是下到上 列是右到左
    • 列是左到右 行是下到上
/**
 * @param {number} n
 * @return {number[][]}
 */
var generateMatrix = function(n) {
  let i = 1
  let res = new Array(n)
  for (let i = 0 ; i < n; i++ ) {
      res[i] = new Array(n).fill(0)
  }
  let left = 0
  let right = n - 1
  let bottom = n - 1
  let top = 0
  while (i <= n*n) {
  //从上到下每一排都是如此
    if (top <= bottom) {
    //模拟从左到右的移动
        for (let j = left; j <= right; j++) {
            res[top][j] = i
            i++
        }
        top++
    }
    if (right >= left) {
        for (let j = top; j <= bottom; j++) {
            res[j][right] = i
            i++
        }
        right--
    }
    if (bottom >= top ) {
        for (let j = right; j >= left; j-- ) {
            res[bottom][j] = i
            i++
        }
        bottom--
    }
    if (left <= right) {
        for (let j = bottom; j >= top; j--) {
            res[j][left] = i
            i++
        }
        left++
    }
  }
  return res
};