代码随想录day2| 977.有序数组的平方、209.长度最小的子数组、54.螺旋矩阵

97 阅读2分钟

学习内容

  • 双指针
  • 滑动窗口
  • 区间定义

习题:

977.有序数组的平方
209.长度最小的子数组
59.螺旋矩阵II

习题总结

977.有序数组的平方

还是双指针思想,数组的开头i,结尾j,一定是比较大的元素,越向中间越小

实现了,但是时间和内存效果都不好,还是要改进 image.png


/**
 * @param {number[]} nums
 * @return {number[]}
 */
var sortedSquares = function(nums) {
    if(nums[0] >= 0 ){
        return nums.map(num=> num*num)
    }else if(nums[nums.length -1] <=0 ){
        return nums.reverse().map(num=> num*num)
    }else{
        let result = []
        for(let i=0,j=nums.length -1;i<nums.length;i++){
            if(i === j){
                result.unshift(nums[i] * nums[i])
                break;
            }
            if(nums[i] * nums[i] >= nums[j] * nums[j]){
                result.unshift(nums[i] * nums[i])

            }else{
                result.unshift( nums[j] * nums[j])
                i--;
                j--;
            }
        }
        return result
    }
};

209 长度最小的子数组

还是双指针,只是这次左边的指针会向后移动
这里由于rightIndex对于判断result时,已经自增1了,所以相当于一个左闭右开的集合,在while时可以使用 <=判断

image.png

/**
 * @param {number} target
 * @param {number[]} nums
 * @return {number}
 */
var minSubArrayLen = function (target, nums) {
    let leftIndex = 0
    let rightIndex = 0
    let result = 0
    let min = 0
    while (rightIndex <= nums.length ) {
         if (result >= target) {
            min = min === 0 ?rightIndex - leftIndex  : Math.min(min, rightIndex - leftIndex)
            result = result - nums[leftIndex]
            leftIndex++
        }  else {
            result = result + nums[rightIndex]
            rightIndex = rightIndex +1

        }
    }
    return 0 || min
};

(读错题了,最开始以为是等于,原来是大于等于。不过代码是自己想到的,好耶!)

59 螺旋矩阵

image.png image.png

image.png 重点:搞清楚边界问题 对于每一条边AB,判断坐标和循环是使用的 [a,b),[b,c)的坐标,然后通过四条边,每圈每个元素的赋值

/**
 * @param {number} n
 * @return {number[][]}
 */
var generateMatrix = function(n) {
    let startX = 0;
    let startY = 0;
    let loop = 1; //循环圈数
    let count = 1;
 
    let martrix =  new Array(n).fill(0).map(() => new Array(n).fill(0));
    const maxLoop = Math.floor(n/2)
    while(loop <= maxLoop){
        let j = startX
        let i = startY
        // 最开始算的长度 ,是 n - 2*(loop -1),但是这个不算长度啊,是坐标
        const lineLen = n-loop
        for(;j < lineLen; j++){
            martrix[i][j] = count;
            count++
        }
        for(;i <lineLen  ; i++){
            martrix[i][j] = count;
            count++
        }
        for(;j > startX; j--){
            martrix[i][j] = count;
            count++
        }
        for(;i > startY; i--){
            martrix[i][j] = count;
            count++
        }
        startX++;
        startY++;
        loop++;
    }
    if(n%2 === 1){
        martrix[maxLoop][maxLoop] = n*n
    }
    return martrix
};

总结备注:做这种题要画图,想清楚坐标对应的点,一级每次的起始条件 坐标!!!一定记住是按坐标往下推导,不要想到长度上去(因为坐标是统一的度量衡)