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

本文主要是介绍【代码随想录算法训练Day2】LeetCode 977.有序数组的平方、LeetCode 209.长度最小的子数组、LeetCode 59.螺旋矩阵II,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Day2 数组、双指针

LeetCode 977.有序数组的平方【排序/双指针】

要将数组的每个元素平方后在按非递减的顺序,最简单的方法就是先将每个数平方,再将结果数组排序。

解法1:排序

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

这里有一个小小的问题,vector在初始化之前不能用下标访问,否则会报错,也就是如果写成ans[i]=nums[i]*nums[i]是会报错的:runtime error: reference binding to null pointer of type ‘int’

解法2:双指针算法

双指针算法的想法是基于本题的条件,原数组本来就是按照非递减的顺序排好的,我们可以利用这一条件,这种情况下,数组两端的数的平方一定比它内侧的数的平方要大,所以我们利用这一点,用两个指针分别从原数组两端选择最大的数,将它的平方逆序排到结果数组中即可。

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {vector<int> ans(nums.size(),0);int i=0,j=nums.size()-1,k=nums.size()-1;while(i<=j){if(nums[i]*nums[i]>nums[j]*nums[j]){ans[k--]=nums[i]*nums[i];i++;}else{ans[k--]=nums[j]*nums[j];j--;} }return ans;}
};

LeetCode 209.长度最小的子数组【滑动窗口】

第一想法当然是暴力算法,但时间复杂度是n2,太大了,这里就不考虑了,除非万不得已,否则还是动动脑子吧。

解法:滑动窗口

滑动窗口就是实现了用一遍循环解决了两遍循环的问题,我们不必再用两遍循环处理子数组的两端,而是利用题目的条件,只在循环中处理右边界,左边界在特殊情况下专门处理,这样就能省下很多时间。

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int i=0,sum=0,len=0,res=INT32_MAX;for(int j=0;j<nums.size();j++){sum+=nums[j];while(sum>=target){//部分和大于target时要用while不断右移左边界,保证窗口宽度最小len=(j-i+1);res=res<len?res:len;sum-=nums[i++];}}return res==INT32_MAX?0:res;}
};

LeetCode 59.螺旋矩阵II【模拟】

看似简单的转圈圈,要处理的边界条件却不少,处理每一条边的时候该处理几个元素,如何保证不重复、不遗漏,都是很关键的问题。一杯茶一包烟,螺旋矩阵转一天。

解法1:直接模拟

如果你对自己的边界处理很有自信,那就像贪吃蛇一样出发就可以了,一直向前,然后自己的数字变大,直到碰到已经处理过的元素或者边界为止,然后转弯继续走,按右→下→左→上的顺序循环往复,直到数字走到n*n为止。

class Solution {
public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> ans(n,vector<int>(n,0));int i=0,j=0,x=2;ans[0][0]=1;while(x<=n*n){while(j<n-1 && ans[i][j+1]==0) ans[i][++j]=x++;//右while(i<n-1 && ans[i+1][j]==0) ans[++i][j]=x++;//下while(j>0 && ans[i][j-1]==0) ans[i][--j]=x++;//左while(i>0 && ans[i-1][j]==0) ans[--i][j]=x++;//上}return ans;}
};

解法2:详细模拟

如果直接模拟有一定困难,那么我们可以对每次转圈,走过的每一条边都进行一下详细的分析,先确定圈数,然后对每次循环都保证走过的每条边都是在合理范围内的,如果边长为奇数,那么特判中心元素即可,比较复杂,但很详细,容易理解。

class Solution {
public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> ans(n,vector<int>(n,0));int startx=0,starty=0;//每圈循环的起始位置int loop=n/2;//循环的圈数int mid=n/2;//矩阵中间位置,用于在n为奇数时为最中间的格赋值int cnt=1;//控制赋值的大小int offset=1;//控制每一条边的长度int i,j;while(loop--){i=startx,j=starty;while(j<n-offset) ans[i][j++]=cnt++;while(i<n-offset) ans[i++][j]=cnt++;while(j>starty) ans[i][j--]=cnt++;while(i>startx) ans[i--][j]=cnt++;startx++;starty++;offset++;}if(n%2) ans[mid][mid]=cnt;return ans;}
};

今天有点难度哦。

这篇关于【代码随想录算法训练Day2】LeetCode 977.有序数组的平方、LeetCode 209.长度最小的子数组、LeetCode 59.螺旋矩阵II的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/973251

相关文章

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

python多进程实现数据共享的示例代码

《python多进程实现数据共享的示例代码》本文介绍了Python中多进程实现数据共享的方法,包括使用multiprocessing模块和manager模块这两种方法,具有一定的参考价值,感兴趣的可以... 目录背景进程、进程创建进程间通信 进程间共享数据共享list实践背景 安卓ui自动化框架,使用的是

SpringBoot生成和操作PDF的代码详解

《SpringBoot生成和操作PDF的代码详解》本文主要介绍了在SpringBoot项目下,通过代码和操作步骤,详细的介绍了如何操作PDF,希望可以帮助到准备通过JAVA操作PDF的你,项目框架用的... 目录本文简介PDF文件简介代码实现PDF操作基于PDF模板生成,并下载完全基于代码生成,并保存合并P

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.