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

文章讲述了如何解决LeetCode中的三个问题,包括对有序数组计算平方并保持递增顺序、找到长度最小的子数组和生成螺旋矩阵。介绍了使用左右指针、动态调整数组和区间遍历的技巧。
摘要由CSDN通过智能技术生成

977 有序数组的平方

题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/
文章讲解:https://programmercarl.com/0977.%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84%E5%B9%B3%E6%96%B9.html
视频讲解: https://www.bilibili.com/video/BV1QB4y1D7ep
注意:
1、本身为非递减排序的数组,返回平方后的数组,并且也按照递增顺序。由于原数组本身有序,因此平方后的数组最大的数值一定在两端(这种涉及到两端的可以考虑采用左右指针)。
2、要想到新建立一个数组,并且指针指向数组最后一位。
方法一:之前做过,这次按照思路自己先写的(区别就是while循环不一样)

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var sortedSquares = function(nums) {
    let i = 0,j = nums.length-1;
    let res = new Array(nums.length).fill(0);
    let k = res.length-1;
    while(i !== j){
        if(nums[i]*nums[i] <= nums[j]*nums[j]){
            res[k] = nums[j]*nums[j];
            k--;
            j--;
        }else{
            res[k] = nums[i]*nums[i];
            k--;
            i++;
        }
    }
    res[k] = nums[i]*nums[i];
    return res;

};

当时在想剩下的最后一位该怎么放到新数组里,画图想到了这种情况下是i===j,所以将其设为while循环的条件,但是需要在while循环外补充一下赋值语句。
方法二:标准解法

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var sortedSquares = function(nums) {
    let left = 0,right = nums.length-1;
    let k = nums.length-1;
    let res = new Array(nums.length).fill(0);
    //这里循环条件设为left<=right,因此包含了相等时的情况
    while(left <= right){
        if(nums[left]*nums[left] <= nums[right]*nums[right]){
            res[k] = nums[right]*nums[right];
            k--;
            right--;
        }else{
            res[k] = nums[left]*nums[left];
            k--
            left++;
        }
    }
    return res;


};

209 长度最小的子数组

题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/
文章讲解:https://programmercarl.com/0209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.html
视频讲解:https://www.bilibili.com/video/BV1tZ4y1q7XE
方法一:使用额外数组来存储长度

/**
 * @param {number} target
 * @param {number[]} nums
 * @return {number}
 */
var minSubArrayLen = function(target, nums) {
    let start = 0,end = 0;
    let res = [];
    let sum = 0;
    while(end < nums.length){
        sum += nums[end];
        while(sum >= target){
            res.push(end-start+1);
            sum -= nums[start];
            start++;
        }
        end++;
        
    }
    if(res.length === 0){
        return 0;
    }else{
    //这里必须加上升序参数,因为不加sort是对ASCII大小进行排序
        res.sort((a,b) => a-b);
        return res[0];
    }
};

方法二:

/**
 * @param {number} target
 * @param {number[]} nums
 * @return {number}
 */
var minSubArrayLen = function(target, nums) {
    let start = 0,end = 0;
    let result = Infinity;
    let sum = 0;
    while(end < nums.length){
        sum += nums[end];
        while(sum >= target){
            result = Math.min(result,end-start+1);
            //先更新sum,再start--,否则不是减掉正确的start
            //缩小窗口
            sum -= nums[start];
            start++;
        }
        //放大窗口
        end++;

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

};

sort函数的使用可参考:https://www.cnblogs.com/aixue/p/7064251.html?utm_source=debugrun&utm_medium=referral

59 螺旋矩阵Ⅱ

题目链接:https://leetcode.cn/problems/spiral-matrix-ii/
文章讲解:https://programmercarl.com/0059.%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5II.html
视频讲解:https://www.bilibili.com/video/BV1SL4y1N7mV/
注意:本题我才用左闭右闭

/**
 * @param {number} n
 * @return {number[][]}
 */
var generateMatrix = function(n) {
    //创建二维数组
    const matrix = new Array(n);
    for (let i = 0; i < n; i++) {
        matrix[i] = new Array(n);
    }
    let top=0,bottom=n-1,left=0,right=n-1;
    let num = 1;
    while(num <= n*n){
        for(let i = left;i<=right;i++){
            matrix[top][i] = num;
            num++;
        };
        top++;
        for(let i = top;i<=bottom;i++){
            matrix[i][right] = num;
            num++;
        }
        right--;
        for (let i = right; i >= left; i--) {
			matrix[bottom][i] = num
            num++;
        }
        bottom--;
        for (let i = bottom; i >= top; i--) {
			matrix[i][left] = num
            num++;
        }
        left++;
    }
    return matrix;

};

在这里插入图片描述
在这里插入图片描述
这次做螺旋矩阵,发现:
1.for循环里i的起始和范围判断是看从左到右,从上到下,从右到左,从下到上,这样来的
2.nums[i][j]里的i,j可以按照画图那样对照看,会改变的是i,不变的看它是在上下左右哪一位置(图中粉色字)
3.本题采用左闭右闭区间,而不是左闭右开

  • 14
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值