Day2 :代码随想录算法训练营第二天| leetcode977. 有序数组的平方、leetcode209.长度最小的字符串、leetcode59.螺旋矩阵II。

1.力扣977 有序数组的平方

问题描述:对于一个非递减数组,将其每个元素平方后,在使其按升序排好。

思路:1.暴力解法:直接for循环让每个元素平方,再sort排序,时间复杂度为O(n+logn)
2.双指针法:由于原数组已经有序,则最大一定出现在数组的两头,那么可以新建一个数组存放 结果,有i,j两个指针分别指向原数组的头和尾,然后比较头尾的平方,大的放在新数组的最后,然后 i,j不断向里逼近,知道i>j时结束。时间复杂度为O(n)
代码如下
1.暴力解法:
在这里插入图片描述
2.双指针法:
在这里插入图片描述总结:暴力解法思路简单明了,就是平方+排序。双指针法利用了有序数组的性质,即最大平方元素一定出现在数组的两头,然后便可不断缩小区间,获取区间两头的较大值存放在新数组result里。

2.力扣209.长度最小字符串

问题描述:给一个正整数target,求当前数组nums中的一个最小的连续的字符串的累积和可以使得其恰好大于或等于target。

思路:
1.暴力解法:相对清晰,但依然有一些细节,比如需要一个临时的长度subLebngth来实时更新长度,需要运用到三目运算符(?:)来便于比较subLength和result。总体上就是第一层循环i遍历时,第二层循环j先后寻找累加sum,直到找到符合条件的位置,计算此时subLength并与result比较。时间复杂度为O(n^2),会超时。
2.滑动窗口法:比较巧妙,精髓在于根据当前的子序列的大小不断的修改子序列的起始位置。由此可以不必像暴力法去机械的一个一个去控制起始位置,并每一次外层循环都需要内层循环从当前位置一个一个向后找,大大减少了时间复杂度,使时间复杂的变为了O(n).
代码如下:
1.暴力解法::2.滑动窗口法:
在这里插入图片描述总结:滑动窗口法的精髓在于子序列可以根据条件的符合情况去自行移动,在运用时要根据题目的情况而定。

3.力扣59.螺旋矩阵II

问题描述:给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]

思路:初看这题非常的抽象,完全没有下手的地方,但实际上可以一层一层往里剥开,其主要难点在于区间的控制和对二维数组行列的控制,它的每一条边的处理实际上就是要么控制行不变改变列 要么是控制列不变改变行。另外的细节就是保持offset、startX、startY的更新以及n为奇数要另外赋值最后的元素。

****代码如下:
在这里插入图片描述在这里插入图片描述总结:该题目主要是抽象模拟,存在一定的数学规律,即层数为n/2。再摸进去后其实就是一个区间控制和一个行列的单独控制。细节就是n为奇数时不要忘了中间的那个数以及offset的更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值