Bootstrap

代码随想录算法训练营第二天 |977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II

977.有序数组的平方

题目链接:. - 力扣(LeetCode)

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

双指针法:i指向起始位置,j指向终止位置

数组其实是有序的, 只不过负数平方之后可能成为最大数了。

那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var sortedSquares = function (nums) {
    let res = []
    let k = nums.length - 1
    for(let i=0,j=nums.length-1;i<=j;){
        if(nums[i]*nums[i] > nums[j]*nums[j]){
            //k指向res数组终止位置
            res[k] = nums[i]*nums[i]
            k--
            i++
        }else{
            res[k] = nums[j]*nums[j]
            k--
            j--
        }
    }
    return res
};
209.长度最小的子数组

题目链接:. - 力扣(LeetCode)

给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。

滑动窗口(双指针法的一种):不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果

只用一个for循环,循环的索引表示滑动窗口的终止位置

窗口的起始位置如何移动:如果当前窗口的值大于等于s了,窗口就要向前移动了(也就是该缩小了)。

/**
 * @param {number} target
 * @param {number[]} nums
 * @return {number}
 */
var minSubArrayLen = function(target, nums) {
    let sum = 0
    let i = 0
    let subLength = 0
    let result = Number.MAX_VALUE
    
    for(let j = 0; j < nums.length; j++){
        sum = sum + nums[j]
        while(sum >= target){
            subLength = j-i+1
            result = result < subLength ? result : subLength

            sum = sum - nums[i]
            i++
        }
    }
    return result === Number.MAX_VALUE ? 0 : result
};
59.螺旋矩阵II

题目链接:. - 力扣(LeetCode)

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

坚持循环不变量原则!坚持每条边左闭右开的原则

模拟顺时针画矩阵的过程:

  • 填充上行从左到右
  • 填充右列从上到下
  • 填充下行从右到左
  • 填充左列从下到上

由外向内一圈一圈这么画下去。

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

;