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

news2024/11/17 5:46:20

有序数组的平方:

题目链接:力扣

知识点:双指针。

思路分析:首先想到的是不怎么动脑子的暴力想法,即先将vector中的各元素用pow函数进行平方,接着再用sort函数对已平方过的数据进行排序。
但是由于sort是基于快速排序法的,故做的的时间复杂度是O(nlogn),且这种个方法不能很好的利用“有序数组”这一特点
有没有复杂度更低一些的方法呢? 这里采用了双指针的方式,left指向vector的头,right指向vector的尾部,比较left和right所指向数据的平方,接着谁大就将谁的平方放入新开辟vector(大小同原有vector)的尾部,并将left或right指针向中间移动。

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
       vector<int> Result(nums.size(),0);
       int Index = nums.size()-1;
       int left = 0;
       int right = nums.size()-1;

       while(left <= right)
       {
           if(pow(nums[left],2)>pow(nums[right],2))
           {
               Result[Index] = pow(nums[left],2);
               left++;
           } 
           else
           {
               Result[Index] = pow(nums[right],2);
               right--;
           }
           Index--;
       }
       return Result;
    }
};

此时时间复杂度为O(n)。

长度最小的子数组:

题目链接:力扣

知识点:滑动串口,双指针,即就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果

思路分析:这题拿到时候,想法和题解差不多,总得来说就是left指针和right指针在最开始时同时指向vector的头,随后right节点不断向右移动,当区间[left,right]之间的值和为target时,记录下此时的子数组长度,下一步将left向右移一步,再将right不断向右移……,同时之后的每次寻找到的子数组长度都与之前的最小子数组长度做比较。

出现的问题:其实思路上还是比较清晰的,但是写的时候会有各种小问题,特别是在边界的定义上。

以下贴上我初次答题是的代码:

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {

        int left = 0;
        int right = 0;
        int sum = nums[left];
        int minsize = INT_MAX;

        while(left <= right && right <= nums.size()-1)
        {
            if(sum < target)
            {
                right++;
                if (right<= nums.size()-1)  sum += nums[right];
                
            }
            else if(sum >= target)
            {
                minsize = minsize < (right - left + 1) ? minsize: (right - left + 1);
                cout<< sum<<" "<<left<<" "<<right<<" "<<minsize << endl;

                sum -= nums[left];
                left++;
            }
        }

        return (minsize==INT_MAX) ? 0: minsize);

    }
};

虽然思路是一样的,但相比而言,卡哥给出的答案更加简洁

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;
    }
};

时间复杂度O(n),空间复杂度O(1)。

螺旋矩阵II

题目链接:力扣

注意点:此题属于模拟过程题,做这题时,有想到卡哥第一天讲到的循环不变法则,画四个边的边界条件都要控制的是一条原则,这样思考写出来的代码才不会混乱
如面对一个3*3的矩阵,
上边界只填充[0,0], [0,1]
右边界只填充[0,2], [1,2]
下边界只填充[2,2], [2,1]
左边界只填充[2,0], [1,0]
可以看出每一个拐角处的处理规则,拐角处让给新的一条边来继续画。坚持【左闭右开】原则,如此依赖外围就会被全部填充完毕,并以此循环

此外还要寻找定义边界的规律,可以发现,一个边长为n的正方形,从里往外第count层(最外圈,count为0),上边界的左右两个边界为 [j,n-1-count), 右边界的上下两个边界为  [i,n-1-count),
下边界的左右两个边界为((n - 1) - (n - 1 - count), j],左边界的上下两个边界为((n - 1) - (n - 1 - count), i],其中i和j分别指行和列的索引,其会随循的改变而变化。


下面贴一下我的代码(这里和卡尔给出的答案相似):

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {

         vector<vector<int>> Res(n, vector<int>(n, 0));
        int i = 0;
        int j = 0;
        int count = 0;
        int index = 0;

        while (index != pow(n,2))
        {
            if (i == n - 1 - count && j == n - 1 - count)
                Res[i][j] = ++index;
            for (j; j < n - 1 - count; j++)
                Res[i][j] = ++index;
            for (i; i < n - 1 - count; i++)
                Res[i][j] = ++index;
            for (j; j > (n - 1) - (n - 1 - count); j--)
                Res[i][j] = ++index;
            for (i; i > (n - 1) - (n - 1 - count); i--)
                Res[i][j] = ++index;

            i++;
            j++;
            count++;
        }
        return Res;           
    }
};

后面的i++ 和 j++ 是由于前面进行了j-- 和 i--;
while中if条件的判断是为了当n为奇数时中心项的填充。

时间复杂度O(n^2),空间复杂度O(1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/517936.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

修复bug:FlexibleButton id相反问题

目录 版本&#xff1a;https://github.com/murphyzhao/FlexibleButton/releases/tag/2.0.1 问题现象 问题描述 查源码&#xff01; 注册 读按键 按键处理 小结 版本&#xff1a;https://github.com/murphyzhao/FlexibleButton/releases/tag/2.0.1https://github.com/mur…

00后自述,生活所迫,不卷一点我能怎么办?

前段时间我去面试了一个软件测试公司&#xff0c;成功拿到了offer&#xff0c;薪资也从10k涨到了15k&#xff0c;对于工作都还没两年的我来说&#xff0c;还是比较满意的&#xff0c;毕竟有些工作了3到4年的可能还没有我的高。 在公司一段时间后大家都说我是卷王&#xff0c;其…

MySQL5.7数据导入/导出、TiDB数据回迁移

一、环境&安装包 CentOS Linux release 7.4.1708 (Core)TDSQL&#xff08;腾讯基于MySQL5.7.x自主研发的数据库&#xff09;Mysqldump&#xff08;MySQL5.7.41备份客户端&#xff09;Dumpling&#xff08;mydumper 的全新升级版&#xff09;Myloader&#xff08;mydumper附…

Flutter 3.10 之 Flutter Web 路线已定,可用性进一步提升,快来尝鲜 WasmGC

随着 Flutter 3.10 发布&#xff0c;Flutter Web 也引来了它最具有「里程碑」意义的更新&#xff0c;这里的「里程碑」不是说这次 Flutter Web 有多么重大的更新&#xff0c;而是 Flutter 官方对于 Web 终于有了明确的定位和方向。 提升 首先我们简单聊提升&#xff0c;这不是…

用处巨广的操作符,快来学学叭(C语言版)

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C知识系统分享》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c…

buildroot 目录结构

buildroot 目录结构 board 存放着不同厂商相关的文件 buildroot-2023.02/board/sipeed/lichee_rv_dock里面描述了如何连接wifi,蓝牙&#xff0c;烧写sdcard.img 如何配置buildroot和编译等 make sipeed_lichee_rv_dock_defconfig makearch 存放着CPU相关的文件&#xff0c…

SQLite:轻量级嵌入式数据库

原创 | 文 BFT机器人 引言 SQLite是一个进程内的库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库&#xff0c;这意味着与其他数据库不一样&#xff0c;您不需要在系统中配置。就像其他数据库&#xff0c;SQLite 引擎不…

AI —— 亲测讯飞星火认知大模型,真的很酷!

讯飞星火认知大模型真的很酷&#xff01; 前言&#x1f64c;讯飞星火认知大模型基本的使用介绍与讯飞星火认知大模型基本的对话 总结撒花&#x1f49e; &#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#xff1a;全神贯注的上吧&#xff01;&#xf…

FE_Vue学习笔记 条件渲染[v-show v-if] 列表渲染[v-for] 列表过滤 列表排序

1 条件渲染 v-show v-if 使用template可以使其里面的内容在html的结构中不变。条件渲染&#xff1a; v-if 1&#xff09;v-if“表达式” 2&#xff09;v-else-if“表达式” 3&#xff09;v-else {} 适用于&#xff1a;切换频率较低的场景。特点&#xff1a;不展示的DOM元素直…

rem、px、em的区别 -前端

文章目录 三者的区别特点与换算举例emrem 总结一总结二 三者的区别 在css中单位长度用的最多的是px、em、rem&#xff0c;这三个的区别是&#xff1a; 一、px是固定的像素&#xff0c;一旦设置了就无法因为适应页面大小而改变。 二、em和rem相对于px更具有灵活性&#xff0c;…

消息认证码以及数字签名的认识

文章目录 消息认证码及数字签名1. 消息认证码1.1 消息认证1.2 消息认证码的使用步骤1.3 go中对消息认证码的使用1.4 消息认证码的问题 2.数字签名2.1 数字签名的生成和验证2.2 数字签名的流程2.3 Go使用RSA进行数字签名2.4 Go使用椭圆曲线进行数字签名2.5 数字签名无法解决的问…

dts pinctrl初始gpio0方法

1、在pinctrl-rockchip.c文件中添加头文件 #include <linux/of_gpio.h> 如下 2、 在如下函数添加红色代码 static int rockchip_pinctrl_probe(struct platform_device *pdev) { struct rockchip_pinctrl *info; struct device *dev &pdev->dev; …

Vue3 自定义指令让元素自适应高度,el-table在可视区域内滚起来

我始终坚持&#xff0c;前端开发不能满足于实现功能&#xff0c;而是需要提供优秀的交互与用户体验。即使没有产品没有UI的小项目&#xff0c;也可以自己控制出品质量&#xff0c;做到小而美。所以前端们不仅仅需要了解框架如何用&#xff0c;还要学习一些设计、交互、体验的知…

新入职了一个00后卷王,天天加班12点,太让人崩溃......

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&…

Android 百度地图SDK闪退

Android 百度地图SDK闪退 通过Android IDE查看APP运行日志Error 1:errorcode: 230 uid: -1 appid -1 msg: APP Mcode码校验失败 在调用百度SDK时出现闪退现象&#xff0c;要知道闪退的具体原因&#xff0c;不然搜了一堆教程&#xff0c;发现纯纯浪费时间&#xff0c;作者也是痛…

知识就是力量,图谱路在何方 | ChatGPT冲击下,招商银行如何“抢救”知识图谱?

“知识就是力量”我们耳熟能详&#xff0c;但培根的这句话其实还有后半句“更重要的是运用知识的技能”。对于人工智能来说&#xff0c;知识图谱就是其如何对知识进行运用的技能体现。在金融领域&#xff0c;如何运用这一技能更好地理解客户需求&#xff0c;提高业务效率和客户…

三层架构与MVC架构区别

三层架构 表示层&#xff1a;主要对用户的请求接受&#xff0c;以及数据的返回&#xff0c;为客户端提供应用程序的访问。 servlet层 业务逻辑层&#xff1a;对我们数据实现业务逻辑的封装 service层 数据访问层&#xff1a;对数据库访问操作 dao层 MVC架构 1.MVC全名是Model …

MATLAB 常用数学函数和数组和字符串、元胞数组和结构体,MATLAB 编程,关系运算符和逻辑变量

目录 MATLAB 零基础学习 简介 使用平台 一、MATLAB 界面 二、基础操作 使用方法 常用数学函数 初等函数 三角函数 指数和对数 复数 标点符号 常用操作 三、文件类型 数组 一、数组基础知识 二、数组创建与操作 创建 数组操作 字符串数组 字符串、元胞数组…

语义分割学习笔记(三)FCN网络结构详解

1.FCN网络概述 FCN网络&#xff08;Fully Convolutional Networks&#xff09;&#xff1a;首个端对端的针对像素级预测的全卷积网络。 FCN网络思想&#xff1a;输入图像经过多次卷积&#xff0c;得到一个通道数为21的特征图&#xff0c;再经过上采样&#xff0c;得到一个与原图…

如何在 Mac 或 Windows 上将 PDF 转换为 Word 而不丢失格式

PDF 有无数的优点&#xff0c;但它不能像 Microsoft Word 文档那样容易编辑。如果您没有价格总是很高的 PDF 编辑器&#xff0c;您将无法根据需要编辑或使用 PDF 源。但是我们可以将PDF转成Word&#xff0c;方便编辑。 有很多解决方案可用于在 Mac 上将 PDF 转换为可编辑的 W…