当前位置: 首页 > article >正文

LeetCode代码随想录(二)——977.有序数组平方、209长度最小子数组、59螺旋矩阵2

目录

一、977有序数组平方

二、209长度最小子数组

三、59螺旋矩阵2


一、977有序数组平方

要求将一个数组的元素平方之后的数按照大小进行排列(注意数组当中有负数)

思路:(1)平方之后再挨个比较排序,时间复杂度nlog(n),pass掉

(2)由于有负数,所以平方之后的最大数肯定是在数组的两侧出现的,那么我们就可以从两侧找,最大的那个就放进新的数组里,但是题目要求的是从小到大排序,为了不让排序完再倒一遍就直接用数组最后一个去装第一个找到的最大的数,依次装入(因为知道数组总长度)

var sortedSquares = function(nums) {
    let k=nums.length
    let array=[]
    for(let i=0,j=k-1;i<=j; ){
        if(nums[i]*nums[i]>=nums[j]*nums[j]){
            array[k-1]=nums[i]*nums[i];
            k--;
            i++;
        }else{
            array[k-1]=nums[j]*nums[j];
            k--;
            j--;
        }
    }
    return array;
};

首先要注意for循环中第三块不是i++或者j--,因为是取了左边才i++,取了右边才j--

二、209长度最小子数组

题目是在一个正整数的数组中,找到这一段元素的和大于等于s的一段连续的最小长度的区间

思路:双指针|滑动区间,两个指针一个指向起始位置,一个指向终止位置,但是终止位置最开始就固定在末尾的。

首先i(起始)、j(末端)都在数组0位置,然后j依次向后移,同时sum+=,直到sum和大于等于s之后进入循环,此刻这个终止位置就固定了,i开始左移,左移完之后的sum不是重新计算,而是减去移动完的那些项 并且i++。

最终会到达一个j不动、i 动的大于等于s的最小长度。

然后j再开始向后移动···

var minSubArrayLen = function(target, nums) {
   let j=0;//终止指针,虽然是终止指针但是不是固定不动的
   let sum=0;
   let i=0;
   let flag=0;
   let minLength=nums.length
   for(j=0;j<nums.length;j++){
    sum+=nums[j]
    while(sum>=target){
        flag=1;
        minLength=Math.min(j-i+1,minLength)
        sum-=nums[i]
        i++;
    }
   }
   if(flag==0) minLength=0;
   return minLength;
};

注意数组中可能所有项加起来都小于s,我设置了一个标识(flag)记录有没有大于等于s过,最后返回最小长度minLength。

三、59螺旋矩阵2

思路:其实就是按照每一行左闭右开去标记,比较麻烦的是数组number里的横纵跟坐标系是反着的,所以我在做的时候到了for循环那里我先把这一行要遍历的坐标写下来,这样更好观察是i还是j变化。

而且我在做的时候是根据例题要求n=3进行的,所以在后面两个for循环里判断条件都是写的>0,导致n=4情况错误(offset的作用),这个时候就画一下图(圈数较多的情况),把外层/边界点用表达式标出来就能比较直观的解决了。

/**
 * @param {number} n
 * @return {number[][]}
 */
var generateMatrix = function(n) {
    let count=1;
    let startx=0;
    let starty=0;
    let offset=1;
    let loop=Math.floor(n/2);
    let number = Array.from({ length: n }, () => Array(n).fill(0));
    while(loop--){
        let i=startx;
        let j=starty;
        for(;j<n-offset;j++){
            number[i][j]=count++;
            //j最后等于n-offset=2
            //(0,0)(0,1)
        }
        for(;i<n-offset;i++){
            number[i][j]=count++;
            //j依旧是n-offset 2;i最后等于n-offset 2
            //(0,2)(1,2)
        }
        for( ;j>starty;j--){
            number[i][j]=count++;
            //i不变还是n-offset 2;j最后等于0
            //(2,2)(2,1)
        }
        for(;i>startx;i--){
            number[i][j]=count++;
            //i最后等于0;j也等于0
            //(2,0)(1,0)
            //一圈完成
        }
        offset++;
        startx++;
        starty++;
    }
    if(n%2===1){
        let k=Math.floor(n/2);
        number[k][k] = count;
    }
    return number;
};


http://www.kler.cn/a/470044.html

相关文章:

  • ArmSoM RK3588/RK3576核心板,开发板网络设置
  • Lianwei 安全周报|2024.1.7
  • Spring Boot项目中使用单一动态SQL方法可能带来的问题
  • stm32week3
  • 科研绘图系列:R语言单细胞数据常见的可视化图形
  • 嵌入式硬件设计的基本流程
  • Unity3D仿星露谷物语开发15之创建道具晃动效果
  • Vue——使用html2pdf插件,下载pdf文档到本地
  • VAxios
  • 深入了解 Nginx:进程、代理及用途解析
  • 苍穹外卖-day07(Spring Cache 购物车业务逻辑)
  • Flink 实时数据处理中的问题与解决方案
  • 【简博士统计学习方法】3. 统计学习方法的三要素
  • laravel 批量更新:‌INSERT ... ON DUPLICATE KEY UPDATE
  • 移动端自动化测试Appium-java
  • AI大模型的搭建和训练
  • Linux——修改文件夹的所属用户组和用户
  • 【A-Lab】部署手册:开源AAA解决方案 —FreeRADIUS
  • Git - 记录一次由于少输入了一个命令导致的更改丢失
  • HTML——72. 下拉列表分组(下拉列表中多选)
  • STM32 I2C通信外设
  • 用ResNet50+Qwen2-VL-2B-Instruct+LoRA模仿Diffusion-VLA的论文思路,在3090显卡上训练和测试成功
  • frameworks 之 Winscope 工具
  • 5. CSS引入方式
  • 安装和配置 Apache 及 PHP
  • 【蓝桥杯——物联网设计与开发】Part1:GPIO