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

2023-09-21 21:00:36

目录

一、(leetcode 977)有序数组的平方

1.暴力解法

2.双指针法

二、(leetcode 209)长度最小的子数组

1.暴力解法

​编辑2.滑动窗口

三、(leetcode 59)螺旋矩阵II


一、(leetcode 977)有序数组的平方

力扣题目链接

1.暴力解法

状态:已AC

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        for(int i=0;i<nums.size();i++)
        {
            nums[i]*=nums[i];
        }
        sort(nums.begin(),nums.end());
        return nums;
    }
};

2.双指针法

状态:已AC,vector用法待整理

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int k=nums.size()-1;
        vector<int>result(k+1,0);
        for(int i=0,j=nums.size()-1;i<=j;)//i <= j,因为最后要处理两个元素
        {
            if (nums[i] * nums[i] < nums[j] * nums[j])  {
                result[k--] = nums[j] * nums[j];
                j--;
            }
            else {
                result[k--] = nums[i] * nums[i];
                i++;
            }
        }
        return result;
    }
};

二、(leetcode 209)长度最小的子数组

力扣题目链接

1.暴力解法

状态:代码无问题,但超时了

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int result = INT32_MAX; // 最终的结果
        int sum = 0; 
        int subLength = 0; 
        for (int i = 0; i < nums.size(); i++) { 
            sum = 0;
            for (int j = i; j < nums.size(); j++) { 
                sum += nums[j];
                if (sum >= s) { 
                    subLength = j - i + 1; 
                    result = result < subLength ? result : subLength;
                    break; 
                }
            }
        }
        // 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
        return result == INT32_MAX ? 0 : result;
    }
};

2.滑动窗口

状态:已AC

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

  • 窗口内是什么?
  • 如何移动窗口的起始位置?
  • 如何移动窗口的结束位置?

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int result = INT32_MAX;
        int sum = 0; 
        int i = 0; 
        int subLength = 0; 
        for (int j = 0; j < nums.size(); j++) {
            sum += nums[j];
            // 注意这里使用while,每次更新 i(起始位置),并不断比较子序列是否符合条件
            while (sum >= s) {
                subLength = (j - i + 1); 
                result = result < subLength ? result : subLength;
                sum -= nums[i++]; // 这里体现出滑动窗口的精髓之处,不断变更i(子序列的起始位置)
            }
        }
        // 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
        return result == INT32_MAX ? 0 : result;
    }
};

三、(leetcode 59)螺旋矩阵II

力扣题目链接

 状态:已AC,边界条件开始有问题,调整好后AC

 左闭右开

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>>res(n, vector<int>(n, 0));
        int startx = 0, starty = 0; // 定义每循环一个圈的起始位置
        int loop = n / 2; // 每个圈循环几次
        int mid = n / 2; // 矩阵中间的位置
        int count = 1;
        int offset = 1; // 需要控制每一条边遍历的长度,每次循环右边界收缩一位
        int i,j;
        while (loop --) {
            i = startx;
            j = starty;
            for (j = starty; j < n - offset; j++) 
            {
                res[startx][j] = count++;
            }
            for (i = startx; i < n - offset; i++) 
            {
                res[i][j] = count++;
            }
            for (; j > starty; j--) 
            {
                res[i][j] = count++;
            }
            for (; i > startx; i--) 
            {
                res[i][j] = count++;
            }
            startx++;
            starty++;
             // offset 控制每一圈里每一条边遍历的长度
            offset += 1;
        }
        // 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
        if (n % 2) {
            res[mid][mid] = count;
        }
        return res;
    }
};

更多推荐

U盘有病毒插上电脑会感染吗?了解下U盘的病毒传播机制

U盘作为一种常见的移动存储设备,我们会经常使用它来传输和存储重要的文件。然而,有时可能会遇到文件被当作病毒误删除的情况,这给我们带来了不便和焦虑。好在,这里将向您介绍一些简单而有效的方法,帮助您恢复被误删除的U盘文件,并探讨U盘的病毒传播机制,解答“U盘有病毒插上电脑会感染吗”的疑惑。▌案例分享“我安装了多个防病毒软件

python+nodejs+php+springboot+vue校园在线拍卖竞拍系统

要想实现在线拍卖系统的各项功能,需要后台数据库的大力支持。管理员验证注册信息,收集的用户信息,并由此分析得出的关联信息等大量的数据都由数据库管理。用户功能模块5.1首页用户登录进入在线拍卖系统可以查看首页、个人中心、历史竞拍管理、竞拍订单管理、留言板管理等内容,如图5.2历史竞拍管理在历史竞拍管理页面可以查看商品名称;

SpringBoot详解

文章目录SpringBoot的特点Spring,SpringBoot的区别SpringBoot常用注解标签SpringBoot概述SpringBoot简单Demo搭建读取配置文件的内容SpringBoot自动配置Condition自定义beanSpringBoot常用注解原理@EnableAutoConfigurati

Universal Robot (UR3)与USB摄像头和电磁夹持器结合的ROS拾取和放置硬件实施详细教程:从连接到实践

第一部分:连接UniversalRobot(UR3)到PC1.将UniversalRobot(UR3)连接到PC(Ubuntu16.04)在实现机器人的自动化任务之前,首先需要确保机器人与计算机之间的连接是稳定的。在这一部分,我们将详细介绍如何将UniversalRobot(UR3)连接到运行Ubuntu16.04的P

Spring编程常见错误50例-Spring Bean依赖注入常见错误(下)

@Value没有注入预期的值问题对于@Value可以装配多种类型的数据:装配对象:@Value("#{student}")privateStudentstudent;@BeanpublicStudentstudent(){Studentstudent=createStudent(1,"xie");returnstude

关键节点与邻居搜索:K-Core算法对比K-Hop算法的效能较量

文章首发地址K-Core算法K-Core算法是一种网络分析算法,用于发现网络中的核心节点。核心节点是指在网络中具有重要影响力的节点,它们连接着大量其他节点,是网络中的重要信息传播和控制中心。K-Core算法通过逐步删除网络中度小于K的节点,直到网络中不存在度小于K的节点为止,然后得到的网络即为K-Core网络。K-Co

有效的括号(栈的高频面试题)

一、题目描述题目连接:有效的括号给定一个只包括'(',')','{','}','[',']'的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。输出需求示例1:输入:s="()"输出:true示例2:输入:s="()[

I/O扩展器IC

一、前言由于单片机资源不足,第一次使用IO扩展器,顺便记录下来使用心得,网上查询资料很少,使用的人不多,基本都得照着手册去手搓,搞底层难啊.需要扩展的IO需求不是很复杂,也不是用来在驱动总线信号,就是扩展为IO,有输入和输出控制即可,之前总用移位寄存器74HC595去扩展IO输出控制,但是需要输入的时候,还是得用专用的

流媒体弱网优化之路(机器学习应用)——了解我们的网络模型

流媒体弱网优化之路(机器学习应用)——了解我们的网络模型——我正在的github给大家开发一个用于做实验的项目——github.com/qw225967/Bifrost目标:可以让大家熟悉各类Qos能力、带宽估计能力,提供每个环节关键参数调节接口并实现一个json全配置,提供全面的可视化算法观察能力。欢迎大家使用——文

医疗革命的关键推手,看AIGC弥合医疗差距的未来之路

随着科技的飞速进步,医疗水平在过去几十年里取得了巨大的突破。这些科技创新不仅改变了我们对健康和医疗的认知,也深刻地塑造了社会的现状。其中,人工智能作为医疗领域的一项前沿技术,正以前所未有的方式影响着我们的生活。它不仅提高了医疗水平,还为社会带来了全新的挑战和机遇。但医疗差距始终一直存在,不同地区和人群之间医疗服务和资源

9.21(复习9.20,9.17,9.13)

1.转轮法对于点查询和范围查询比较复杂,散列划分适合点查询,范围划分适合点查询和范围划分2.XML数据库适合管理复杂数据结构的数据集,当数据本身具有层次特征时,由于XML数据格式能够清晰表达数据的层次特性。9.201.混合水平是水平分片,垂直分片和导出分片的混合2.关联挖掘是用于发现数据库中数据间的关联习惯3.提取游标

热文推荐