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

代码随想录day2|977.有序数组的平方|209.长度最小的子数组|59.螺旋矩阵II 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。:每个元素进入滑动窗口操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是 2 × n 也就是O(n)因为将 nums[start] 从 sum 中减去后,仍然可能满足 sum≥s,故该操作可能不止一次,并且将其元素平方之后,存储子数组(滑动窗口)中的元素和。 阅读详情

代码随想录|704.二分查找、27.移除元素

有序数组的平方

文档讲解:代码随想录
视频讲解:LeetCode:977.有序数组的平方
状态:能做

  1. 思路
    之后刷的时候用各种排序算法写一下。
    主要还是利用双指针,考虑到负数和正数,在平方后可能出现大小颠倒的情况,所以需要寻找一个分割线,然后利用两个指针来判断两段中的数的大小,较小的填入返回数组,并移动下标。
    分割线就是第一个不小于0的数。但这种方法还需要注意全是负数的情况
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        //获取第一个大于等于0的数
        int middle = -1;
        for(int i=0;i<nums.size();i++)
        {
            if(nums[i]>=0)
            {
                middle = i;
                break;
            }
        }

        //判断全是负数的情况,最终结果是倒序
        if(middle == -1)
        {
            middle = nums.size();
        }

        //定义两个指针,一个从最大的负数开始middle-1,一个从最小的非负数开始middle
        int pt1 = middle-1;
        int pt2 = middle;

        //当pt1>=0并且pt2<size的时候进行判断,并填入返回的数组
        //当有一个超出了限制,则将剩下的另一个全部填入数组依序。
        vector<int> res(nums.size());
        int k = 0;
        while(pt1>=0&&pt2<nums.size())
        {
            if(nums[pt1]*nums[pt1] > nums[pt2]*nums[pt2])
            {
                res[k] = nums[pt2]*nums[pt2];
                k++;
                pt2++;
            }
            else
            {
                res[k] = nums[pt1]*nums[pt1];
                k++;
                pt1--;
            }
        }

        //将剩下的填入
        while(pt1>=0)
        {
            res[k] = nums[pt1]*nums[pt1];
            k++;
            pt1--;
        }
        while(pt2<nums.size())
        {
            res[k] = nums[pt2]*nums[pt2];
            k++;
            pt2++;
        }

        return res;
    }
};
  1. 代码随想录方法
    利用头指针和尾指针向中间收缩,注意两头的值肯定是平方后的最大值,所以返回数组的填写需要通过倒序填写。并且循环处理的终止条件是左指针大于右指针,因为两个指针同时指向的值也需要填入,一般为最小值。
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> res(nums.size());
        int left = 0;
        int right = nums.size()-1;
        int k = nums.size()-1;
        for(left,right;left<=right;)
        {
            if(nums[left]*nums[left]>=nums[right]*nums[right])
            {
                res[k] = nums[left]*nums[left];
                k--;
                left++;
            }
            else
            {
                res[k] = nums[right]*nums[right];
                k--;
                right--;
            }
        }
        return res;
    }
};

长度最小的子数组

文档讲解:代码随想录
视频讲解:拿下滑动窗口! | LeetCode 209 长度最小的子数组
状态:85%

  1. 思路
    连续子数组,相当于用一个子数组去框选长度最小满足条件的范围,首先确定头和尾就使用两个指针,当和一直小于target那么就移动尾指针,如果和大于等于target后就向前移动头指针,并减去之前的头指针指向的位置。
    之前我的写法没有用while判断,导致头尾指针的移动在一起(错误),减枝不好处理。后来学习过后,利用while处理头指针的移动,使得头尾指针的移动能够分开来进行。
    当和一直大于等于target移动头指针,当和小于target移动尾指针
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        //数组长度记录
        int count = 0;

        //头指针,当sum>=target时移动
        int left = 0;

        //尾指针,当sum<target时移动
        int right = 0;

        //和,当小于target时由right控制,大于等于targte时由left控制
        int sum = 0;

        
        while(right<nums.size())
        {
            sum += nums[right];
                while(sum>=target)
                {
                    if(count > right-left+1 || count == 0)
                    {
                        count = right-left+1;
                    }
                    sum -= nums[left++];
                }
            right++;
        } 
        return count;       
    }
};

螺旋矩阵II

文档讲解:代码随想录
视频讲解:一入循环深似海 | LeetCode:59.螺旋矩阵II
状态:不会

  1. 思路
    一个螺旋就是一个循环,从外层向里依次填入数据。主要需要思考的问题有以下几点
    1. 循环的次数:n/2
    2. 新循环的起点:最开始是0,0,循环一次后是1,1,所以需要每次循环完进行+1操作
    3. 每次循环每条边的填充长度控制:最开始是n-1个位置都需要填,第二次是n-2,所以每次循环完之后进行-1操作
    4. 奇数n的中间数操作:对于奇数n,中间数一定是他的平方数,而对于偶数n不存在,所以利用mod2来判断是否是奇数
    5. 填充操作:首先要注意不能重复填充,特别是每层循环的4个角位置,如果我们对填充操作的边界是<=或者>=那么肯定会出现重叠,所以应该选择左闭右开的方式来进行填充。其次是每次填充由右向左进行填写时,注意边界,应当是当前的起点坐标对应的x,y值。
class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        //0,0 -> 0,n-1        [0,n-1) ->
        //0,n-1 -> n-1,n-1    [0,n-1)  ⬇
        //n-1,n-1 -> n-1,0    [n-1,0) <-
        //n-1,0 -> 0,0        [n-1,0) ⬆
        int size = n-1;
        vector<vector<int>> res(n,vector<int>(n));

        //起始位置
        int numx = 0;
        int numy = 0;

        //填充循环数
        int loop = n/2;
        //填充数
        int i = 1;
        
        //每条边的长度控制
        int k = 1;

        while(loop--)
        {
            //每条边的填入位置控制
            int a = numx;
            int b = numy;
            //-> x=0 , y[0,n-1)
            for(b;b<n-k;b++)
            {
                res[a][b] = i++;
            }
            //⬇ y=n-1 , x[0,n-1)
            for(a;a<n-k;a++)
            {
                res[a][b] = i++;
            }
            //<- x=n-1 , y[n-1,0)
            for(b;b>numx;b--)
            {
                res[a][b] = i++;
            }
            //⬆ y=0 , x=[n-1,0)
            for(a;a>numy;a--)
            {
                res[a][b] = i++;
            }

            //一层做完,更新起始位置和循环边的长度
            numx++;
            numy++;
            k++;
        }

        //考虑n为奇数,那么最中间的数就是n²
        if(n%2)
        {
            res[n/2][n/2] = n*n;
        }

        return res;
    }
};

时间复杂度:k(n-1+n-2+…+1) = O( n 2 n^2 n2)

螺旋矩阵

  1. 思路
    本题和上一题相似,具体两点区别
    1. 一个是二维变一维,一个是一维变二维
    2. 这道题的边长不相等了。
      第一个变化很容易解决,就是在循环中把赋值操作换一下,第二点就需要更多的判断了以及设计到循环次数的控制。
      使用m/2和n/2较小的数作为循环次数,这样在循环完成之后,只会剩下1列或者1行,直接读入就可以了。其次在最后读入的时候还需要考虑现在是不是已经读取完毕了,比如对于3行2列的情况,在1次循环过程中已经可以满足所有的数据读入。
class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {

        //行数
        int m = matrix.size();
        //列数
        int n = matrix[0].size();

        int loop = m<n?m/2:n/2;

        //返回数组
        int k = 0;
        vector<int> res(m*n);

        //循环读取
        int numx = 0;
        int numy = 0;
        int check = 1;



        while(loop--)
        {
            int i = numy;
            int j = numx;

            //-> i=0 j[0,n-1)
            for(j;j<n-check;j++)
            {
                res[k++] = matrix[i][j];
            }

            //⬇ j=m-1 i[0,m-1)
            for(i;i<m-check;i++)
            {
                res[k++] = matrix[i][j];
            }

            //<- i=m-1 j[n-1,0)
            for(j;j>numy;j--)
            {
                res[k++] = matrix[i][j];
            }
            
            //⬆ j = 0, i[n-1,0)
            for(i;i>numx;i--)
            {
                res[k++] = matrix[i][j];
            }

            numx++;
            numy++;
            check++;
        }
        //正方形奇数矩阵,读取最后一个数
        if(m==n && m%2)
        {
            res[k] = matrix[m/2][n/2];
        }

        //其他普通矩阵,读取剩余的列(行数为m/2)或者行(列数为n/2)
        //需要注意的是,目前应当采用[]区间,因为要获得最后一个数
        //具体的逻辑,可以考虑如何读取只有1行或者1列的方法。
       if(m>n)
       {
           for(int i=numx;i<=m-check;i++)
           {
               if(k<m*n){
                   res[k++] = matrix[i][n/2];
               } 
           }
       }
       if(m<n)
       {
           for(int j = numy;j<=n-check;j++)
           {
               if(k<m*n)
               {
                   res[k++] = matrix[m/2][j];
               }
           }
       }
       return res;
    }
};
Claude Code 官方文档+3 个高活跃社区+5 个可复用开源项目:14.4 节持续学习资源实测清单 揭示 Claude Code 的核心交互范式是「状态机驱动的对话式编程」,强调官方文档实为配置契约、社区是直觉验证场、开源项目是配置能力校准器;通过真实故障案例解析上下文丢失根源,提出以工程化方式管理 claude.config.json、CLAUDE.md 和技能配置。 阅读详情

相关推荐

C语言|深入浅出讲解int转换为float全过程(附2017年统考大题案例)

int转换为float类型为什么会发生精度损失? 精度损失的详细过程究竟是什么样的? 什么样情况float会发生精度损失?没有弄懂2017年浮点数统考大题? 这一篇用2017年统考大题案例帮你更深的理解浮点数的存储规则。

DADONGOOO的博客 1万+

【代码随想录】Day2 数组2 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

Day2今天深入强化了数组,通过子数组,螺旋矩阵等题目进一步加深了对概念的理解,加强了对双指针和数组结合的理解。DAY2 Finished 撒花~

SuperMao2016的博客 1450

python实现ECMS算法

ECMS(Equivalent Consumption Minimization Strategy)算法是一种用于混合动力汽车能量管理系统的优化策略。它通过计算等效油耗来平衡电池电量消耗和燃油消耗,从而优化整体能耗。以下是一个简单的Python实现,用于演示ECMS算法的基本思想。这个实现假设了一个简单的混合动力汽车模型,其中电池电量和燃油消耗是主要的优化目标。

weixin_45570158的博客 922

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

代码随想录day2

xccxynb的博客 792

手把手教你解决Realsense D455在ROS下IMU数据不输出的问题(附固件降级指南)

本文详细解析了Realsense D455在ROS环境下IMU数据不输出的问题,提供了固件降级和ROS配置的完整解决方案。通过版本兼容性分析和实战操作指南,帮助开发者快速恢复IMU数据流,优化机器人开发体验。

weixin_42531494的博客 372

海康VisionMaster零代码开发实战:从PLC工程师到视觉专家的捷径

本文为PLC工程师提供了利用海康VisionMaster视觉平台实现零代码视觉开发的实战指南。文章详细阐述了如何通过图形化流程设计替代传统编程,快速搭建视觉检测应用,并实现与PLC的无缝通讯,是工程师从设备控制迈向视觉系统集成的有效捷径。

weixin_29201859的博客 293

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

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

weixin_46620779的博客 4014

【Oracle】Oracle rman工具使用(真的细)

Oracle RMAN(Recovery Manager)是Oracle数据库备份和恢复的官方工具,它提供的备份和恢复功能非常强大和可靠。RMAN可以备份整个数据库或特定表空间、数据文件、控制文件和归档日志,同时还可以进行增量备份和增量恢复。RMAN还提供了诸如备份验证、备份优化、备份复制、备份集管理、恢复操作、自动备份、自动恢复等高级功能。它使用的备份和恢复格式是Oracle通用的备份集(Backup Set),这使得备份和恢复非常灵活和高效。

tttzzzqqq2018的博客 8503

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

要把数组中的元素的平方从小到大排序,而数组本身又是从小到大(更准确的说是非递减顺序),那么平方值最大的元素肯定位于两端。具体的说,C++中,一维数组、二维数组都是内存地址连续的,java中一维数组是连续的,二维不是,二维的每一行的首地址是连续的,每一行首地址用指针指向行内的元素,每一行内也是连续的。这道题暴露了我写代码的误区:总是用直接数控制循环的边界,比如nums.size()-1,nums.size()-2,这导致一旦循环的边界需要变动的时候,需要不断调整直接数,最后就是越写越乱。

apple_52404684的博客 1978

【OpenClaw企业级智能体实战】第10篇:医疗行业OpenClaw实战:病历自动书写、医保智能审核与患者随访管理(附HIPAA合规配置+完整代码)

医疗行业正面临“效率提升需求”与“合规监管红线”的双重矛盾:病历书写占据医生30%-50%工作时间,医保审核效率低下,患者随访工作量巨大,但医疗数据“不出域”“责任不转移”的要求又限制了AI落地。本文基于华为云、腾讯云安全规范及中关村科金、复旦大学附属中山医院等真实实践,拆解OpenClaw在医疗场景的五大核心应用(病历自动书写、医保智能审核、患者随访管理、科研文献综述、医学影像预处理),提供私有化部署架构、HIPAA合规配置模板、完整实操流程及可直接运行的代码。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 441

【YOLOv8科研级优化】集成YOLOv10的SCDown采样模块,让你的模型下采样更高效更精准

打开确保模型解析器能识别SCDown模块。通过将YOLOv10的SCDown模块集成到YOLOv8中,我们实现了一个“细节保留+高效下采样”的目标检测模型。这个改进不仅在工程上能提升小目标、细粒度场景的检测效果,更在科研上提供了“分阶段下采样”的创新思路——这种思路可以延伸到其他卷积网络(如ResNet、MobileNet)的下采样层改进中,帮你在论文中打造独特的研究点。

m0_71589036的博客 137

代码随想录【day 2】| 977.有序数组的平方、209.长度最小的子数组、 59.螺旋矩阵II

代码随想录【day 2】| 977.有序数组的平方、209.长度最小的子数组、 59.螺旋矩阵II

weixin_43891814的博客 3096

YOLOv8改进:注意力系列篇 |高效的通道先验卷积注意力(CPCA) | 中科院 2023.6

高效的通道先验卷积注意力(CPCA)方法,支持注意力权重在通道和空间维度上的动态分布;

会AI的学姐 2043

代码随想录Day2 | 977. 有序数组的平方,209. 长度最小的子数组,59. 螺旋矩阵II

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

weixin_43913958的博客 1107

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

代码随想录C++ Day2 | LeetCode977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II

这一题的关键是理解和分解螺旋,首先,螺旋可以分为一个个完整的圈(注意如果n是奇数,则最后一个圈只有一个格子),每一圈的左上角格子都是(0,0), (1,1),(2,2)...;将指针i, j之间的区域视为滑动窗口,指针j负责将滑动窗口右扩,滑动窗口变大,累加和增加,直到累加和满足条件时,再控制指针i依次右移,滑动窗口变小,累加和变小,一直到累加和不满足条件就停止右移。输入:target = 11, nums = [1,1,1,1,1,1,1,1]解释:平方后,数组变为 [16,1,0,9,100]

blackdog_的博客 1200

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

数组:双指针、滑动窗口、模拟

宁愿过拟合不要欠拟合 2090

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

代码随想录训练营 Day2打卡 数组part02 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

代码随想录训练营 Day2打卡 数组part02 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

qq_42952637的博客 1458

代码随想录算法训练营Day 2|LeetCode977 有序数组的平方、Leetcode209 长度最小的子数组、Leetcode59 螺旋矩阵 II、Leetcode54 螺旋矩阵

像滑动窗口、螺旋矩阵这样的题方法性比较强,一开始看到题都断了思路,也是理解了为啥卡哥推荐先看视频和文章之后再做题,以后一定改T T。

qq_52807368的博客 3252

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

因为这道题不是第一次做到,由于数组非递减,并且数组元素有正数有负数,在平方之后,数组里的负数平方可能会比数组中一些正数的平方还大,要求是对平方后的数组排序,因此整个数组其实中间的数平方后反而会更小,知道这个规律以后,看到提示说用双指针,所以直接定义一个left,一个right指针,只要考虑两个指针的一些移动就可以。首先其实可以找规律,这个循环的方式是→↓←↑,如果n是偶数,循环n/2次结束,如果是奇数,循环完n/2次,还有一个中间的数需要填充,那么就可以直接把循环→↓←↑写好,然后迭代循环就好。

zjububbleYu的博客 917

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

是对第一天双指针写法还有区间定义的一些进一步练习。总体来说难度还是有一些的。加之有不少细节的地方需要处理。

qq_62455003的博客 1417

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

通过定义四个方向(右下左上),并根据当前方向计算下一个位置,如果下一个位置不合法(越界或者已经被填充),则顺时针旋转到下一个方向来构建螺旋矩阵。代码详解:框架是定义一个公共类别,然后给A一个动态数组整型的定义,然后遍历数组A,把每个A【i】平方,再把A里面的元素排序,再返回A。比较两个指针所指元素平方的大小,将较大的平方值从结果向量的末尾开始填充,逐步向结果向量头部填充,这样直接得到排序后的结果向量。输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]

dhc6519的博客 687

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

leetcode题目:有序数组的平方、长度最小的子数组、螺旋数组II

weixin_44837088的博客 1492

代码随想录算法训练营Day2|Leetcode977有序数组的平方、209长度最小的子数组、59螺旋矩阵II

Day2打卡!通过这三道题,不仅对每个题涉及的思路有所学习(双指针、滑动窗口、循环不变量),同时每道题代码中涉及到的小小细节也得到了学习,非常不错👍!

m0_60979177的博客 2888

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

有序数组的平方,长度最小子数组,螺旋矩阵II

qq_40988139的博客 700

代码随想录|day2打卡:977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

代码随想录|day2打卡:977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,总结

qq_18746745的博客 1223

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

Introsort算法在排序的过程中,首先使用快速排序来快速地进行划分,当快速排序的递归深度超过一定限制时,为了避免快速排序的最坏情况时间复杂度O(n^2)的发生,转而使用插入排序,这样可以保证时间复杂度不会超过O(nlogn)。最直观的方法就是遍历数组并平方,然后对新数组排序,排序如果使用冒泡的话,输入规模最大1e4,在O(n^2)下就是1e8,估计会超时的,试了一下确实超时了。数组最大的数满足max{左端,右端},使用双指针,i指向左起始位置,j指向右起始位置。虽然我觉得跟毛毛虫一样。

2302_79277225的博客 1116
上一篇: 代码随想录|704.二分查找、27.移除元素
下一篇: 代码随想录Day3| 203.移除链表元素707.设计链表206.反转链表
sRiddle
博客等级 码龄7年 528粉丝 63原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值