代码随想录训练营第二天 | 有序数组平方、长度最小的子数组、螺旋矩阵ii

91 阅读1分钟

有序数组的平方

题目链接:有序数组的平方

  • 思路:由于题目是非递减序列,有可能包含负数,平方后会大于前面的值,所以新的数组的最大值一定在左右两边,想到可以用双指针,left & right左右遍历,找出最大值赋值给新数组的最右边
  • 时间复杂度:O(n)
  • 空间复杂度: O(1)
var sortedSquares = function(nums) {
    const res = new Array(nums.length).fill(0)
    let i = 0, j = nums.length - 1, k = nums.length - 1
    while(i <= j) {
        let left = nums[i] * nums[i]
        let right = nums[j] * nums[j]
        if(left <= right) {
            res[k--] = right
            j--
        } else {
            res[k--] = left
            i++
        }
    }

    return res
};

长度最小子数组

题目链接:长度最小的子数组

  • 思路:由于要找出最小的满足target的子数组的长度,可以用双指针定义一个滑动窗口,使用快慢指针
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
var minSubArrayLen = function(target, nums) {
    let fast = 0, slow = 0
    let sum = 0, len = Infinity
    for(; fast < nums.length; fast++) {
        sum += nums[fast]
        while(sum >= target) {
            len = len < (fast - slow + 1) ? len : (fast - slow + 1)
            sum -= nums[slow++]
        }
    }

    return len === Infinity ? 0 : len
};

螺旋矩阵

题目链接

  • 思路:模拟遍历循环
var generateMatrix = function(n) {
    // 定义二维数组
    const arr = new Array(n).fill(0).map(() => new Array(n).fill(0))
    let startX = startY = 0
    let offset = 1
    let mid = loop = Math.floor(n / 2)
    let count = 1
    while(loop--) {
        let raw = startX, col = startY
        for(; col < n - offset; col++) {
            arr[raw][col] = count
            count++
        }
        for(; raw < n - offset; raw++) {
            arr[raw][col] = count
            count++
        }
        for(; col > startY; col--) {
            arr[raw][col] = count
            count++
        }
        for(; raw > startX; raw--) {
            arr[raw][col] = count
            count++
        }

        offset++
        startX++
        startY++
    }

    if(n % 2) {
        arr[mid][mid] = count
    }

    return arr
};